Seite 1 von 1
[C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:08
von Schrompf
Moin,
ich habe hier ein kleines Problem. Ich habe ein globales Array aus Strukturen, deren Größe ich gern zur Compile Time irgendwo abgelegt hätte. Mein Ansatz sieht so aus:
Code: Alles auswählen
// Im Header
extern const MeineStruktur gStrukturen[];
extern const size_t gAnzStrukturen;
// im Source
const MeineStruktur gStrukturen[] =
{
{ bla, "blbb", 1 },
{ quiff, "snöff", 3 },
{ wieps, "blälch", 27 }
};
// Anzahl Strukturen
const size_t gAnzStrukturen = sizeof( gStrukturen) / sizeof( MeineStruktur);
Und euch C++-Eingeweihten fällt wahrscheinlich sofort auf, was daran faul ist: die Anzahl ist immer 0. Gibt es eine Möglichkeit, die Anzahl Element in diesem Array irgendwie zu bestimmen und in eine Variable rauszuziehen? Ich möchte eigentlich vermeiden, die Größe des Arrays explizit anzugeben, wenn in der Definition des Arrays doch vollautomatisch und zur Compile Time feststeht, wie groß es ist.
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:12
von Schrompf
Ok, das war schnell gelöst. Und der Grund war wie immer ein Klasse2-Eigentrottel.
Code: Alles auswählen
// Anzahl Strukturen
const size_t gAnzStrukturen = sizeof( gAnzStrukturen) / sizeof( MeineStruktur);
Die ursprünglichen Variablennamen waren deutlich länger, weil ich speziell bei globalen Variablen gern aussagekräftige Namen habe. Und da ging das kleine "Anz" zwischendurch völlig unter :-( Tut mir leid, dass ich euch damit behelligt habe.
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:17
von Krishty
Neinein. Das Problem habe ich ebenfalls; und mir ist die globale Variable immernoch keine ausreichende Lösung. Falls jemand fragt, warum bei der extern-Deklaration von gStrukturen keine Größe angegeben wird: weil man die dann doppelt angeben muss; und falls man es an einer Stelle vergisst kommt es zur Katastrophe weil C++ ohne Warnung überzählige Elemente mit 0 initialisiert. Wirklich ekelhaft, das alles.
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:22
von Schrompf
Hm. Bei mir geht das jetzt aber so, wie es im Startbeitrag steht. Ich hatte wirklich nur den falschen Variablennamen im sizeof().
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:54
von CodingCat
Deshalb eXiles "schöne" Lösung:
Code: Alles auswählen
namespace helper
{
template <class T, size_t S> char (&arraylen_helper(T (&a)[S]))[S];
}
#define arraylen(a) sizeof(::helper::arraylen_helper(a))
Wenn in
arraylen mal kein Array gesteckt wird, merkst du das sofort. :)
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:55
von dot
Oder std::extent ;)
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 20:57
von CodingCat
dot hat geschrieben:Oder die C++ Lösung: std::extent ;)
http://en.cppreference.com/w/cpp/types/extent hat geschrieben:If T is an array type, provides the member constant value equal to the number of elements along the Nth dimension of the array, if N is in [0, std::rank<T>::value). For any other type, or if T is array of unknown bound along its first dimension and N is 0, value is 0.
Nein, ganz sicher nicht. Auch wenn das einer der Punkte ist, an dem man sich fragt, was das C++-Komitee geritten hat.
0 ist das letzte, was man hier will, deshalb auf keinen Fall
std::extent.

Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 21:01
von dot
Wieso sollte std::extent nicht funktionieren (ich meinte natürlich zum Initialisieren der Variable)? Aber ja, wieso das 0 zurückgibt anstatt einen Compilerfehler zu erzeugen, war mir auch schon immer ein Rätsel...
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 21:02
von CodingCat
dot hat geschrieben:Wieso sollte std::extent nicht funktionieren (ich meinte natürlich zum Initialisieren der Variable)?
Weil genau das Schrompfs Fehler war, dass versehentlich kein Array angegeben war.
Re: [C++] Größe eines globalen Arrays ermitteln
Verfasst: 06.01.2013, 21:08
von Schrompf
Stimmt, sehr aufmerksam. Vielen Dank für die Tipps und die Diskussion, man lernt doch immer was dazu.