Ĺadny brzuch
Zabrałem się do pisania pewnego programu, w którym istotną rolę odgrywa lista jednokierunkowa.
No i klops. Nie wiem, czy zbyt długo odpoczywałem od programowania, czy co innego, bo rady sobie dać nie mogę.
Oto kod:
#include <stdio.h> typedef struct { union { char *string; int integer; float real; } content; struct tfield *next; } tfield; tfield *first, *last; //wskaźniki na początek i koniec listy tfield *createfield() //alokacja pamięci dla nowego elementu listy { tfield *new; new = (tfield *)malloc(sizeof(tfield)); new->next = NULL; return (new); } void addfield(short int type) //dodanie nowego elementu na koniec listy { tfield *field; field = createfield; if(first == NULL) first = field; else { last->next = field; } //last->next = NULL; last = field; } void main() //funkcja główna - test funkcji tworzących elementy listy { int i; tfield *tmp; first = last = NULL; clrscr(); for(i=0;i<3;i++) { addfield(0); last->content.integer=i; printf(" => %d",last->content.integer); printf(" -> %d",first->content.integer); } for(tmp=first;tmp!=NULL;tmp=tmp->next) { printf("\n : %d",tmp->content.integer); } getch(); }
Problem polega na tym, że zarówno zmienna first, jak i last wskazują na ostatni element listy, co w konsekwencji powoduje, że listy nie ma.
Od pewnej modyfikacji program przed wyłączeniem pokazuje także informację "null pointer assignment"
Bardzo proszę o pomoc, z góry dziękuję...
Użytkownik Cobra.TeaM edytował ten post 05 maj 2007, 23:49
tak na przyszlosc - wrzucaj caly kod razem, kazdy widzi co jest funkcja glowna a gdzie masz definicje, a ciagle przesuwanie ekranu w gore i dol utrudnia czytanie ;)
blad miales brutalny - brak nawiasow w wywolaniu createfield - w efekcie program podstawial losowy wskaznik zamiast efektu wywolania funkcji, w c takie cos konczy sie tylko warningiem (w c++ juz errorem).
poza tym cos chyba jeszcze zmienilem zeby dzialalo, zreszta porownaj sam (no i przy wyswietlani usunalem pokazywanie tego pierwszego elementu w petli bo utrudnia czytelnosc ;) a juz sie nie zmienia):
#include <stdlib.h> typedef struct { union { char *string; int integer; float real; } content; struct tfield *next; } tfield; tfield *first, *last; //wskaźniki na początek i koniec listy tfield * createfield() { tfield *new; new = (tfield *) malloc (sizeof(tfield)); new->next = NULL; return new; } void addfield(short int type) { tfield *field; field = createfield(); if(first == NULL) first = field; else { last->next = field; } //last->next = NULL; last = field; } void main() { int i; tfield *tmp; first = last = NULL; for(i=0;i<3;i++) { addfield(0); last->content.integer=i; printf(" => %d",last->content.integer); // printf(" -> %d",first->content.integer); } for(tmp=first;tmp!=NULL;tmp=tmp->next) { printf("\n : %d",tmp->content.integer); } system("PAUSE"); }
Użytkownik Deadeye edytował ten post 05 maj 2007, 21:46
Cóż... taki błąd to kompromitacja...
Ale w końcu od tego błędy są, aby się na nich uczyć... (tutaj się pocieszam, wiem)
Sorka za bałagan, faktycznie rozdzielenie tego kodu to był... błąd (heh). Naprawię to.
No i oczywiście wielkie dzięki, bo jestem już na końcówce, a tu takie coś się trafiło...
A tak nawiasem - ten program robię pod Turbo C - kompilator uznawał ten kod za bezbłędny...
i jeszcze jedno - funkcja main() zawierała tylko kod, który miał testować listę i nie miał bezpośredniego związku z moim programem
Dziękuję i pozdrawiam.
Użytkownik Cobra.TeaM edytował ten post 06 maj 2007, 00:07
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
No i klops. Nie wiem, czy zbyt długo odpoczywałem od programowania, czy co innego, bo rady sobie dać nie mogę.
Oto kod:
#include <stdio.h> typedef struct { union { char *string; int integer; float real; } content; struct tfield *next; } tfield; tfield *first, *last; //wskaźniki na początek i koniec listy tfield *createfield() //alokacja pamięci dla nowego elementu listy { tfield *new; new = (tfield *)malloc(sizeof(tfield)); new->next = NULL; return (new); } void addfield(short int type) //dodanie nowego elementu na koniec listy { tfield *field; field = createfield; if(first == NULL) first = field; else { last->next = field; } //last->next = NULL; last = field; } void main() //funkcja główna - test funkcji tworzących elementy listy { int i; tfield *tmp; first = last = NULL; clrscr(); for(i=0;i<3;i++) { addfield(0); last->content.integer=i; printf(" => %d",last->content.integer); printf(" -> %d",first->content.integer); } for(tmp=first;tmp!=NULL;tmp=tmp->next) { printf("\n : %d",tmp->content.integer); } getch(); }
Problem polega na tym, że zarówno zmienna first, jak i last wskazują na ostatni element listy, co w konsekwencji powoduje, że listy nie ma.
Od pewnej modyfikacji program przed wyłączeniem pokazuje także informację "null pointer assignment"
Bardzo proszę o pomoc, z góry dziękuję...
Użytkownik Cobra.TeaM edytował ten post 05 maj 2007, 23:49
tak na przyszlosc - wrzucaj caly kod razem, kazdy widzi co jest funkcja glowna a gdzie masz definicje, a ciagle przesuwanie ekranu w gore i dol utrudnia czytanie ;)
blad miales brutalny - brak nawiasow w wywolaniu createfield - w efekcie program podstawial losowy wskaznik zamiast efektu wywolania funkcji, w c takie cos konczy sie tylko warningiem (w c++ juz errorem).
poza tym cos chyba jeszcze zmienilem zeby dzialalo, zreszta porownaj sam (no i przy wyswietlani usunalem pokazywanie tego pierwszego elementu w petli bo utrudnia czytelnosc ;) a juz sie nie zmienia):
#include <stdlib.h> typedef struct { union { char *string; int integer; float real; } content; struct tfield *next; } tfield; tfield *first, *last; //wskaźniki na początek i koniec listy tfield * createfield() { tfield *new; new = (tfield *) malloc (sizeof(tfield)); new->next = NULL; return new; } void addfield(short int type) { tfield *field; field = createfield(); if(first == NULL) first = field; else { last->next = field; } //last->next = NULL; last = field; } void main() { int i; tfield *tmp; first = last = NULL; for(i=0;i<3;i++) { addfield(0); last->content.integer=i; printf(" => %d",last->content.integer); // printf(" -> %d",first->content.integer); } for(tmp=first;tmp!=NULL;tmp=tmp->next) { printf("\n : %d",tmp->content.integer); } system("PAUSE"); }
Użytkownik Deadeye edytował ten post 05 maj 2007, 21:46
Cóż... taki błąd to kompromitacja...
Ale w końcu od tego błędy są, aby się na nich uczyć... (tutaj się pocieszam, wiem)
Sorka za bałagan, faktycznie rozdzielenie tego kodu to był... błąd (heh). Naprawię to.
No i oczywiście wielkie dzięki, bo jestem już na końcówce, a tu takie coś się trafiło...
A tak nawiasem - ten program robię pod Turbo C - kompilator uznawał ten kod za bezbłędny...
i jeszcze jedno - funkcja main() zawierała tylko kod, który miał testować listę i nie miał bezpośredniego związku z moim programem
Dziękuję i pozdrawiam.
Użytkownik Cobra.TeaM edytował ten post 06 maj 2007, 00:07