structs, verschiedene Datein, Zugriff
-
Hallo allerseits,
folgender Fehler tritt beim Compilieren meines Codes auf:
"Anfrage nach Element "xPos" in etwas, was keine Struktur oder Variante ist"if((movingObjects=getObjects())!=NULL) value++; printf("bla: %d",movingObjects[0].xPos);
Der Fehler entsteht in der zweiten Zeile. Diese steht in meiner main.c, die Funktion getObjects sowie die Deklaration des structs "struct object" stehen in einer object.c bzw. object.h die per include in main eingebunden sind.
object.c:... #include "objects.h" struct object* createObject(char id, int xPos, int yPos, int healthPoints, int attack, char type){ struct object* newObject = malloc(sizeof(struct object)); newObject->id = id; newObject->xPos = xPos; newObject->yPos = yPos; newObject->healthPoints = healthPoints; newObject->type = type; newObject->attack = attack; return newObject; } struct object** getObjects(){ struct object** objects = (struct object**) malloc(50*sizeof(struct object*)); objects[0] = createObject(1,50,50,100,10,0); return objects; }
object.h:
struct object{ char id; int xPos; int yPos; int healthPoints; int attack; char type; }; struct object** getObjects();
Es scheint mir, als wenn das Dateienübergreifende das Problem ist. Die Funktionen createObject und getObjects habe ich bereits seperat in object.c getestet. Sie funktionieren einwandfrei, man kann auf die einzelnen structs im Array zugreifen.
Ich bitte um Hilfe, vielen Dank im Vorraus, mit freundlichen Grüßen,
petterapamm
-
Damit der Zugriff
movingObjects[0].xPos
klappt, muss movingObjects vom Typ struct object* sein. (ein einfacher Zeiger)
Laut Rückgabewert vongetObjects
ist es aber ein struct object** . (ein Doppelzeiger)Du hast vergessen, uns die Definition von
movingObjects
zu zeigen.
-
Entschuldigung, ja, hier:
struct object** movingObjects;
-
Fügt man folgende Zeilen hinzu, besteht das Problem:
struct object* obj1 = (struct object*) movingObjects[0]; printf("bla: %d",obj1.xPos);
-
Bei
movingObjects[0].xPos
wird durch die Klammer [] ein * "entfernt"
Ist also noch einer übrig.Warum muss das ein Doppelzeiger sein?
-
Wenn nur noch einer da ist, müsste ich doch drauf zugreifen können, oder?
Ich denke, zwei, weil das ganze Konstrukt ein Array aus structs ist. Da der Array aus einer Funktion raus übergeben wird, geschieht das als Pointer, und in ihm sind Pointer auf bestimmte structs. Deswegen ein Pointer auf einen Pointer.
-
Wenn der Zeiger in der Parameterliste steht hast du recht.
Dann ist er aber nur lokal in der Funktion ein Doppelzeiger.Du nutzt aber den Rückgabewert der Funktion. Da brauchst du keinen Doppelzeiger.
-
Lass ich bei der Deklaration von movingObjects den zweiten Stern weg, dann kann ich auf das Element zugreifen, allerdings mit folgender Ausgabe:
bla: 334854
Das entspricht nicht dem, was xPos eigentlich sein sollte (nämlich 10).
-
Danke auf jeden Fall schon mal für deine Hilfe!
-
Ich sehe gerade das du movingObjects als Array of Pointer to struct füllst.
Da passt das mit den **
Dann mach malprintf("bla: %d",movingObjects[0]->xPos);
-
Danke für deine Hilfe, das hat funktioniert.
Dennoch, wo genau besteht der Unterschied zwischenmovingObjects[0].xPos
und
movingObjects[0]->xPos
?
-
Bei
movingObjects[0].xPos
muss der Teil vor dem Punkt eine struct sein.
BeimovingObjects[0]->xPos
muss der Teil vor dem -> ein Zeiger auf ein struct sein.
Das ist eine alternative Schreibweise für(*movingObjects[0]).xPos
Suchwort wäre "Zeiger auf Strukturen"