[C++] Größe eines globalen Arrays ermitteln

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 5163
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

[C++] Größe eines globalen Arrays ermitteln

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5163
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8350
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag 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.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 5163
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag von Schrompf »

Hm. Bei mir geht das jetzt aber so, wie es im Startbeitrag steht. Ich hatte wirklich nur den falschen Variablennamen im sizeof().
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag 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. :)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag von dot »

Oder std::extent ;)
Zuletzt geändert von dot am 06.01.2013, 20:58, insgesamt 1-mal geändert.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag 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. :cry:
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag 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...
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag 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.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 5163
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: [C++] Größe eines globalen Arrays ermitteln

Beitrag von Schrompf »

Stimmt, sehr aufmerksam. Vielen Dank für die Tipps und die Diskussion, man lernt doch immer was dazu.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten