ďťż

Ł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
  •