Absturz in while-Schleife
-
Hi,
ich habe ein Problem und erkenne den Fehler nicht.
Ich habe mir eine struct geschrieben.
typedef struct ListElement{ char sValue[256]; BOOL used; struct ListElement *next; } listElement;
Dazu habe ich mir eine Methode geschrieben, die auf eine Element zugreifen soll.
while((*pElement).used == TRUE) pElement = (*pElement).next;
Die bools habe ich wie folgt definiert:
#define BOOL int #define FALSE 0 #define TRUE 1
Bei der Abfrage nach TRUE bricht er ab.
Beim debuggen fragt er ab und springt direkt noch einmal in die Abfrage.
Danach wird das Programm beended.Woran liegt das?
Danke.
Gruß,
rizor
-
Ich vermute, daß die Abfrage auf einem null-Objekt durchgeführt wird. Hast du vielleicht etwas mehr Code, der "drumherum" liegt?
Übrigens: statt
(*pElement).used
kannst du
pElement->used
schreiben.
Und statt "beended" "beendet".
-
Du solltest noch zeigen, wo du (*pElement).used einen Wert zu gewiesen hast. Am besten im direkten Zusammenhang mit dem bereits geposteten Code.
-
Liegt am Ende der Liste IMMER ein gültiges Element mit used == FALSE?
-
wozu brauchst du so ein used feld überhaupt, lass das doch lieber gleich weg...
-
ascda schrieb:
wozu brauchst du so ein used feld überhaupt, lass das doch lieber gleich weg...
Ich habe da nunmal eine Liste und ich möchte die mit diversen Prozessen durchlaufen.
Damit die Teile nicht immer neu bearbeitet werden wollte ich das so markieren.LordJaxom schrieb:
Liegt am Ende der Liste IMMER ein gültiges Element mit used == FALSE?
Nein, dass habe ich nun noch abgefangen.
Danke, der fehler wäre mir nicht aufgefallen.D-U-D-E schrieb:
Ich vermute, daß die Abfrage auf einem null-Objekt durchgeführt wird. Hast du vielleicht etwas mehr Code, der "drumherum" liegt?
Übrigens: statt
(*pElement).used
kannst du
pElement->used
schreiben.
Und statt "beended" "beendet".
Nein, es wird nicht auf ein NULL-Element zugegriffen.
Hier ist noch ein wenig mehr Code:
char *getElement(struct List *pList){ struct ListElement *pElement = pList->first; while((pElement->used == TRUE) && (pElement != NULL)) pElement = pElement->next; if(pElement == NULL) return NULL; else{ pElement->used = TRUE; return pElement->sValue; } } void addElement(struct List *pList , char sValue[]){ struct ListElement *pElement = malloc(sizeof(listElement)); strcpy(pElement->sValue , sValue); pElement->next = NULL; pElement->used = FALSE; //check if the list is empty if(pList->first == NULL) pList->first = pElement; else{ struct ListElement *pLast = pList->first; //get the last element of the list while(pLast->next != NULL) pLast = pLast->next; //link the new element pLast->next = pElement; } }
Hoffentlich könnt ihr mir jetzt helfen.
Danke
Gruß,
rizor
-
Ohne Gewähr: vertausch mal die beiden Bedingungen in dem while-Kopf.
-
Das hat leider nicht geholfen,
-
Wo wird denn used auf TRUE gesetzt? Und müsste die Abfrage nicht so lauten:
while((pElement != NULL) && (pElement->next != NULL)) pElement = pElement->next;
-
Wenn mans richtig macht, reicht eine der beiden Bedingungen schon vollkommen aus.
-
uUuuUu schrieb:
Wo wird denn used auf TRUE gesetzt? Und müsste die Abfrage nicht so lauten:
while((pElement != NULL) && (pElement->next != NULL)) pElement = pElement->next;
Nein, muss es nicht.
Denn es reicht schon, wenn das aktuelle Element NULL ist, dann ist die Liste zu Ende.
Used wird erst später auf used gesetzt.
Diese Methode soll mir ja ein unbenutztes Element zurückgeben.
Dieses Element wird kurz vor dem Methodenende auf TRUE gesetzt.