Lista łączona, program wywala się kiedy dojdzie do pętli – gdzie jest błąd?

0

Hej, mam problem z warunkiem, program wywala sie kiedy dojdzie do tej petli i niestety nie potrafie znalezc bledu. Program na chwile obecna robiony bez getterow i setterow. Dokladniej chodzi mi o to miejsce:

while((*szukacz).nast!=NULL)
 {
       szukacz=(*szukacz).nast;
 }
(*szukacz).nast=new Box(wiersz);
#include "egzamin.h"
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

egzamin::egzamin()
{
    pocz=NULL;
    ile=0;
};

egzamin::~egzamin()
{
    Box *killer;
    while(pocz!=NULL)
    {
        killer=pocz;
        pocz=(*killer).nast;
        delete killer;
    }
};

void egzamin::pobierz()
{
    ifstream plik;
    plik.open("C:\Ja\STUDIA\c++\Sesja\1\konta.txt");

    plik.open("konta.txt", ios::in | ios::out);
    if( plik.good()==true )
    {
        Box *szukacz;
        szukacz=pocz;

        string wiersz;

        while (!plik.eof())
        {
            getline(plik,wiersz);

            if(pocz==NULL)
            {
                pocz=new Box(wiersz);
            }
            else
            {
                while((*szukacz).nast!=NULL)
                {
                    szukacz=(*szukacz).nast;
                }
                (*szukacz).nast=new Box(wiersz);
            }
        }
    }
    else
    {
        cout << "BLAD PLIKU";
    }
};

#ifndef EGZAMIN_H_INCLUDED
#define EGZAMIN_H_INCLUDED
using namespace std;
#include<string>

struct egzamin{


    struct Box{
        string numer;
        Box *nast;
        Box(string n,Box *adres=NULL)
        {
            numer=n;
            nast=adres;
        }
    };
    Box *pocz;
    int ile;


    egzamin();
    ~egzamin();
    void pobierz();
};

#endif // EGZAMIN_H_INCLUDED
0

1. Dlaczego nie używasz operatora strzałki szukacz->nast.?

2. Problem jest taki, że w momencie gdy wchodzisz w tą pętlę szukacz jest NULL. Dlaczego?
Najpierw masz konstruktor, który mówi, że: pocz = NULL (dlaczego nie nullptr zgodnie ze sztuką?)
Potem ten sam pocz przypisujesz do nowo utworzonej, niezaalokowanej zmiennej szukacz.
Na końcu próbujesz wyłuskać jakikolwiek prawidłowy adres robiąc (*szukacz).nast, ale przecież adres jest NULL.


Przede wszystkim:
zadbaj o alokację swoich wskaźników zanim ich użyjesz,
sprawdzaj wskaźniki pod kątem prawidłowego adresu tak, jak robisz to z nast. w pętli,
używaj inteligentnych wskaźników. W Twoim prostym przypadku wystarczy Ci unique_ptr.

0

Zbytnio sie rozkrecilem na funkcji, przenioslem wszystko zwiazane z plikiem do maina, a tutaj zostawilem tylko warunek i wszystko pieknie dziala :D
Jesli chodzi o nullptr NULL oraz -> przyzwyczajenie, Naprawilem problem z pustym adresem, jestem wdzieczny bo nie widzialem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1