Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

błąd przy dodawaniu kolejnego klienta

Ostatnio zmodyfikowano 2012-01-17 16:25
Autor Wiadomość
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:
C/C++
#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;
}
P-48354
El-Pablo
Temat założony przez niniejszego użytkownika
» 2012-01-16 22:52:49
czyli nikt nie czai wskaźników :)
P-48467
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.
P-48469
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.... 
P-48489
ison
» 2012-01-17 15:39:05
co robisz:
wrzucasz element na swoją listę
C/C++
if( poczatek == NULL )
{
    poczatek = nowa;
}

usuwasz element na który wskazuje nowa, czyli element z Twojej listy (bo w tym przypadku poczatek == nowa)
C/C++
delete nowa;

przy kolejnym dodaniu wywołujesz
else
 bo początek nie jest NULL
C/C++
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
P-48508
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 :).
P-48527
« 1 »
  Strona 1 z 1