Merkwürdiges Problem mit Struct-Member
-
Ich führe eine bestimmte Anzahl Male die folgende Funktion aus.
void AddItem(Event *event_new) { char buffer[100]; strcpy(events[num_events].type, event_new->GetType(buffer)); events[num_events].time = event_new->time; events[num_events].entity1 = event_new->entity1; events[num_events].entity2 = NULL; num_events++; }Hier werden die Eigenschaften eines Element eines Arrays von Structs gefüllt und dann anschließend für den nächsten Aufruf der Funktion der Zähler um eins hochgesetzt. Ich habe aber nun beim Ausgeben des Arrays beobachtet, dass das type-Attribut aller Elemente des Arrays immer den Wert hat, der beim letztem Aufruf der Funktion ja eigentlich nur dem letzten Element zugewiesen werden sollte.
Da ich vermute, dass das ganze entweder mit der strcpy-Funktion, der GetType-Funktion oder beidem zu tun hat, sollte ich wohl noch sagen, wie letztere funktioniert. Die nimmt nämlich per Call-by-Reference einen char-Puffer, in den sie einen String schreibt und diesen dann wieder zurückgibt. (Also vom Typ char*.)
Woran liegt es also, dass alle type-Eigenschaften jedes Elements des Arrays von jedem Aufruf beeinflusst zu sein scheinen?
-
Du verkackst was mit deinen Strings, verwende statt char* doch einfach std::string. Das bißchen verlorene Performance erlöst dich von der Fehlersuche.
Wenn du das Problem unbedingt lösen möchtest: Eventuell hat events[num_events].type noch keinen Speicher und du schreibst reinzufällig immer an die selbe Position und hast viel viel Glück gehabt, dass dir deine Applikation nicht um die Ohren geflogen ist.
MfG SideWinder
-
Ich habe type jetzt mal folgendes gemacht:
struct EventItem { //char *type; char type[20]; float time; Entity *entity1; Entity *entity2; };und jetzt geht es. Macht das denn einen Unterschied? (Dumme Frage, anscheinend ja schon!) Ich dachte nämlich, Arrays und Pointer sind intern so ziemlich das gleiche. Daher kann ich das nicht ganz nachvollziehen.
-
Hallo
Pointer und statische C-Arrays können in gewissen Situationen gleich behandelt werden, aber sind nicht das gleiche. In deinem Fall ist der entscheidene Unterschied das bei statischen Arrays automatisch genug Speicher für die einzelnen Elemente auf dem Stack (bzw. Heap... je nach Scope) reserviert wird. Bei Pointern ist das aber nicht der Fall. Schon alleine nicht weil der Compiler bei Pointern ja nicht wissen kann wie viel Speicher zur Laufzeit gebraucht wird, sprich wieviele Elemente da sein werden.
Du solltest wirklich lieber std::string nehmen, sicherer und eleganter.
bis bald
akari
-
Ich würde das radikaler ausdrücken: Pointer und Arrays sind zwei grundlegend verschiedene Dinge und haben grundsätzlich gar nichts miteinander zu tun.
Ein Pointer hält eine Adresse einer bestimmten Speicherposition. Ein Array ist eine Ansammlung von n gleichtypigen Objekten im Speicher.
Der Name den du in C++ für das Array vergibst, ist als Variable in vieler Hinsicht gleich einem Pointer auf das erste Element des Arrays. Wenn du ein Array im Heap anlegst bekommst du zB nur einen Zeiger auf das erste Element des Arrays zurück.
Aber ein Pointer ist nicht automatisch ein Array! Ein Pointer zeigt erstmal ins Nirvana, und wenn du dorthin schreibst dann hast du Glück wenn dir das Programm nicht um die Ohren fliegt. Also zuerst Speicher holen auf den dann dein Pointer zeigen kann (Achtung der Speicher muss irgendwann auch wieder weg).
Wenn du deinen Speicher als String verwendest dann übernimmt diese ganze Memory-Geschichte am besten eine Klasse, und - welch Wunder - so eine gibts bereits: std::string. Die wär auch praktisch zu verwenden, und ja, verwende sie - jetzt!
MfG SideWinder
-
Vielen Dank für die Erklärungen. In der Tat scheint mir das schlüssig. Ich hatte mich wohl zu starr auf die Vorstellung, dass man Arrays auch als Pointer auf das erste Element "darstellen" kann, fixiert.
Was die STL-Container angeht, so habe ich von denen gehört, und bin auch sehr von ihren Vorteilen überzeugt, aber für eine Weile (zumindest für mein derzeiotiges Projekt) werde ich noch mit C-Strings arbeiten, einfach um die Erfahrung damit zusammeln und eben genau die Fehler wie diesen hier einmal zu machen, statt es mir gleich einfach zu machen und dabei ein Wissen auf wackeligem Fundament zu haben.
Für größere Sachen werde ich mich aber auf keinen Fall mehr mit char-Arrays rumschlagen.
-
So ists gut, Grundlagen lernen und dann umsteigen

MfG SideWinder