sizeof(array) / sizeof(array[0]) liefert falschen Laufindex
-
Hallo allerseits!
Ich habe ein array aus structs, welches ich in einer FOR Schleife durchlaufen möchte. Ich habe bisher immer folgende Methode verwendet:
for (int i = 0; i<sizeof(array)/sizeof(array[0]); i++) {irgendwas machen}Nun liefert mir jedoch "sizeof(array)/sizeof(array[0])" immer eine 0 zurück, so dass die FOR Schleife nicht betreten wird.
Das zum array gehörende Struct sieht so aus:
struct event{ string name; int priority; string plc_ioaddress_1; string plc_ioaddress_2; char edge_ind; bool ctrl; bool shrd; };Das array habe ich so befüllt:
event *events1 = new event[8]; events1[0].name = "CB1_r"; events1[0].priority = 200; events1[0].plc_ioaddress_1 = "A10.6"; events1[0].plc_ioaddress_2 = ""; events1[0].edge_ind = '+'; events1[0].ctrl = 1; events1[0].shrd = 0; events1[1].name = "CB1_l"; events1[1].priority = 200; events1[1].plc_ioaddress_1 = "A11.0"; events1[1].plc_ioaddress_2 = ""; events1[1].edge_ind = '+'; events1[1].ctrl = 1; events1[1].shrd = 0; ...Diese FOR Schleife wird leider nie betreten. Erst wenn ich als Abbruchbedingung "i<8" angebe, geht es.
for (int i = 0; i<sizeof(events1)/sizeof(events1[0]); i++) { std::cout << "Hallo\n"; }Nach ein wenig Fehlersucherei mit std::cout habe ich festgestellt, dass sizeof(events1) = 4 und sizeof(events1[0]) = 20 ist!
Woran könnte das liegen und wie bekomme ich für diese Art von array einen richtigen Laufindex?MFG,
Frank
-
Diese sizeof()-Konstruktion funktioniert nur, wenn du ein echtes Array hast (d.h. wenn es per
irgendwas array[n];definiert wurde). Bei dynamisch angefordertem Speicher liefert "sizeof(array)" nur die Größe eines Zeigers (also idR 4).PS: Was spricht eigentlich gegen STL-Container?
-
Diese sizeof()-Konstruktion funktioniert nur, wenn du ein echtes Array hast (d.h. wenn es per irgendwas array[n]; definiert wurde).
Achso! Das war mir nicht bewusst. Das löst mein Problem, danke!

PS: Was spricht eigentlich gegen STL-Container?
Eigentlich nichts. Die Größe dieses "event arrays" ist bekannt und jedes einzelne Element muss vom Benutzer sowieso explizit eingetippt werden. Da war das (in meinen Augen) naheliegendste ein simples array.
-
FrankTheTank87 schrieb:
PS: Was spricht eigentlich gegen STL-Container?
Eigentlich nichts. Die Größe dieses "event arrays" ist bekannt und jedes einzelne Element muss vom Benutzer sowieso explizit eingetippt werden. Da war das (in meinen Augen) naheliegendste ein simples array.
Wenn die Größe bekannt ist, hast du erst recht keinen Grund den Speicher per new anzufordern. Ansonsten sollte ich eventuell erwähnen, daß der sizeof-Trick auch dann schiefgeht, wenn du das Array als Parameter herumreichst (die Deklarationen
void foo(int* p)undvoid foo(int p[])sind identisch - und in der Funktion kann der Compiler die Array-Größe nicht feststellen). Btw, im neuen Standard C++0x gibt es auch einen Container mit konstanter Größe (std::array<>).