PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : struct "undeclared (first use in this function)"



crocodilechris
15-12-2009, 16:12
Hallo,

ich muss bis Donnerstag einen Stack implementieren für die Uni und ich habe ein Problem, welches ich mir nicht erklären kann:
Ich habe 2 structs:

struct stack_element{
/* Wert des Elements */
long value;
/* Zeiger auf (naechstes oder vorheriges) Element im Stack */
struct stack_element *element;
};

/*
* Das struct zur Verwaltung des Stacks könnte zum Beispiel wie folgt aussehen:
*/
struct stack_data{
/* Zeiger auf das unterste/erste Element im Stack */
struct stack_element *first;
/* Zeiger auf das oberste Element im Stack */
struct stack_element *top;
/* Anzahl der Elemente im Stack */
long count;
};
zum Testen ist meine Main-Methode erstmal nur folgendes:

int main() {
struct stack_data * Stack;
//long Zahl;
// (a):
stack_initialize(&Stack);
return 0;
}
Die Funktion sieht wie folgt aus:

int stack_initialize (struct stack_data ** Stack) {
//Speicherplatz allockieren
struct stack_data *tmp_d = /*(stack_data *)*/calloc(1, sizeof stack_data);
if (tmp_d == NULL) {
return -1;
} else {
Stack = &tmp_d;
return 0;
}
};
Und die mir völlig unerklärliche Compilermeldung ist:

chris@Terra-Lap:Blatt6$ gcc stack_2.c
stack_2.c: In function ‘stack_initialize’:
stack_2.c:109: error: ‘stack_data’ undeclared (first use in this function)
stack_2.c:109: error: (Each undeclared identifier is reported only once
stack_2.c:109: error: for each function it appears in.)
Warum nun ist "stack_data" undeclared? Das ist doch das definierte struct. :(

Yonibear
15-12-2009, 16:26
struct stack_data *tmp_d = /*(stack_data *)*/calloc(1, sizeof stack_data);


Hier müsste es sizeof(struct stack_data) heißen.

sommerfee
15-12-2009, 17:50
und hier



Stack = &tmp_d;


muß es stattdessen


*Stack = tmp_d;

heißen.

Liebe Grüße,
Axel

crocodilechris
15-12-2009, 19:23
struct stack_data *tmp_d = /*(stack_data *)*/calloc(1, sizeof stack_data);
Hier müsste es sizeof(struct stack_data) heißen.
Ah da lag der Fehler, vielen Dank!
Find das nicht ganz intuitiv, dass man bei nem Verbund immer wieder angeben muss, dass es sich um einen Verbund handelt.

@sommerfee:
THX, hatte ich beim Neuschreiben verdreht. :o

Jetzt hab ich nurnoch nen Fehler beim pop, dass sieht bisher noch so aus, schmeißt aber nen "segmentation fault":

int stack_pop(struct stack_data * Stack, long * Wert) {
*Wert = Stack->top->value;
--(Stack->count);
*Stack->top = Stack->first[Stack->count];
//free(Stack->top);
return 0;
};Hab den Fehler schon auf die Zeile mit dem Stack->top lokalisiert.
Und wenn ich das free(Stack->top) versuche, schaltet sich "glibc" ein und gibt mir ne Memory map ...

anda_skoa
17-12-2009, 13:36
Hab den Fehler schon auf die Zeile mit dem Stack->top lokalisiert.

Dann ist entweder Stack, Stack->top oder Wert kein gültiger Pointer.
Setzt deine stack_initialize auch alle Werte auf sinnvolle Defaults? Z.B NULL für die enthaltenen Pointer?

Ciao,
_

crocodilechris
21-12-2009, 11:19
das wars gewesen, stack->first war nicht gesetzt, hab vergessen die Aktualisierung zu posten.