błąd przy dodawaniu kolejnego klienta
Ostatnio zmodyfikowano 2012-01-17 16:25
El-Pablo Temat założony przez niniejszego użytkownika |
błąd przy dodawaniu kolejnego klienta » 2012-01-16 00:39:18 Witam, czy ktoś moze mi powiedzieć czy jeśli w funkcji dodającej klientów, na koniec dam delete wskaznik; to program zachowuje sie nastepujaco dodaje mi pierwszego klienta do bazy, a jak chce dodac kolejnego to sie zawiesza, oto kod: #include <cstdlib> #include <iostream> #include <fstream> #include <string>
using namespace std; struct osoba { int id_klienta; string imie; string nazwisko; int telefon; osoba * next; };
osoba * poczatek = NULL;
void dodaj_k() { fstream plik; osoba * nowa = new osoba; cout << "Wpisz imie "; cin >> nowa->imie; cout << "Wpisz nazwisko "; cin >> nowa->nazwisko; cout << "Wpisz telefon "; cin >> nowa->telefon; nowa->next = NULL; if( poczatek == NULL ) { poczatek = nowa; } else { osoba * szukaj = poczatek; while( szukaj->next != NULL ) { szukaj = szukaj->next; } szukaj->next = nowa; } plik.open( "klient.txt", fstream::out | fstream::app ); if( plik.is_open() ) { if( poczatek != NULL ) { osoba * pokaz = poczatek; while( pokaz->next != NULL ) { plik << pokaz->imie; plik << endl << pokaz->nazwisko; plik << endl << pokaz->telefon << endl; pokaz = pokaz->next; } plik << pokaz->imie; plik << endl << pokaz->nazwisko; plik << endl << pokaz->telefon << endl; } plik.close(); delete nowa; } else cout << "Nie udalo sie otworzyc pliku"; }
int main( int argc, char * argv[] ) { int a; cout << "\n *MENU* \n\n \n1 - Dodaj klienta do bazy"; cin >> a; switch( a ) { case 1: dodaj_k(); break; default: cout << "\nNie rozpoznano polecenia sprobuj jeszcze raz !!!\n\n"; } cin.clear(); cin.sync(); }
system( "PAUSE" ); return EXIT_SUCCESS; } |
|
El-Pablo Temat założony przez niniejszego użytkownika |
» 2012-01-16 22:52:49 czyli nikt nie czai wskaźników :) |
|
ison |
» 2012-01-16 23:01:05 Nie możesz zrobić delete nowa; bo usuwasz wtedy obiekt na który wskazuje nowa czyli część swojej listy. To że pod inny wskaźnik przypiszesz ten wskaźnik to nie znaczy, że możesz usunąć obiekt na, który wskazuje nowa bo to nadal ten sam obiekt. |
|
El-Pablo Temat założony przez niniejszego użytkownika |
» 2012-01-17 13:32:19 hmmm, bo ten obiekt zapisuje do pliku i jak dodam nowego klienta to doda mi do pliku nowego klienta i tego ktory wczesniej byl wpisany wiec klienci w bazie beda mi sie powtarzac, a wiec chce zeby przy dodaniu kolejnego klienta był on pierwszym klientem w liscie wtegy doda mi do pliku tylko tego klienta to w takim razie ktory wskaznik musze usunac poleceniem delete, bo jak przegladalem inne programy tego typu to tak wlasnie usuwali wskaznik.... |
|
ison |
» 2012-01-17 15:39:05 co robisz: wrzucasz element na swoją listę if( poczatek == NULL ) { poczatek = nowa; }
|
usuwasz element na który wskazuje nowa, czyli element z Twojej listy (bo w tym przypadku poczatek == nowa) przy kolejnym dodaniu wywołujesz else bo początek nie jest NULL osoba * szukaj = poczatek; while( szukaj->next != NULL )
|
przecież element ktory byl wskazywany przez poczatek usunałeś przy poprzednim dodaniu klienta, odwołujesz się do elementu, który nie istnieje bo już go usunąłeś bo jak przegladalem inne programy tego typu to tak wlasnie usuwali wskaznik....
|
Ty nie usuwasz wskaźnika tylko element na który wskazuje wskaźnik, to jest różnica ;p jak chcesz możesz poczatek też ustawiać na NULL przy usuwaniu klienta, ale to wtedy nie bedzie miala sensu lista jak i tak z niej nie korzystasz http://cpp0x.pl/kursy/Kurs-C++ /Dynamiczne-zarzadzanie-pamiecia-new-i-delete/307 |
|
El-Pablo Temat założony przez niniejszego użytkownika |
» 2012-01-17 16:25:55 rzeczywiście masz racje ison, błąd w moim mysleniu przy kolejnym dodaniu poczatek jest rozny od NULL, dzieki wielkie, teraz smiga :). |
|
« 1 » |