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

[C++]Lista list podwieszanych. Błąd przy zapisie danych wyjściowych do pliku.

Ostatnio zmodyfikowano 2018-02-10 17:19
Autor Wiadomość
Dossja
Temat założony przez niniejszego użytkownika
[C++]Lista list podwieszanych. Błąd przy zapisie danych wyjściowych do pliku.
» 2018-02-08 20:32:47
Witam :)
Na zaliczenie laboratoriów z programowania dostałam za zadanie stworzenie tzw. ”Dziekanatu”. Polega to na tym, że na wejściu dostaję pliki txt zawierające dane wykładowcy i w kolejnych linijkach dane studentów i ich oceny. Program ma segregować te dane dla poszczególnych studentów i zapisywać je do plików.
Wymogiem było użycie drzew bądź list. Ja zdecydowałam się na użycie list jednokierunkowych z danymi studentów, wskaźnikiem na następny element oraz wskaźnikiem na listę podwieszaną jednokierunkową z wpisami danego studenta. W ta podwieszana lista również jest jednokierunkowa i każdy jej element zawiera wskaźnik na następny wpis tego studenta.
Program (wedle mojej wiedzy) działa poprawnie na etapie otwierania tych plików i wpisywania ich do list. Problem pojawia się dopiero na etapie zapisu tych danych do pliku wyjściowego.
Do zapisu służy mi „górna” pętla tworząca nowy plik i nadająca mu nazwę . Działa ona dla warunku aż wskaźnik na następny element jest nullptr (student->next != nullptr). Wtedy ma kończyć swoje działanie. Wewnątrz tej pętli znajduję się kolejna pętla obsługująca listę podwieszaną, która ma wpisywać do pliku kolejne wpisy dla warunku (wpisy->next != nullptr).
I tu właśnie pojawia się problem. Program zapisuje poprawnie te dane dla pierwszego ze studentów, aż nie dochodzi do etapu, że wskaźnik na następny to nullptr. Wtedy właśnie pojawia się crash „0xCDCDCDCD”.
Gdy sprawiałam, że pętla ta nie istniała to program działał poprawnie (tworzył pliki z danymi studenta choć oczywiście bez wpisów).
Od dwóch dni głowię się jak ten problem rozwiązać a oddanie projektu niestety zbliża się wielkimi krokami… :(
C/C++
while(( wp->next ) != nullptr )
{
    plik << wp->nazwiskoProwadzacego << "\t\t" << wp->nazwaPrzedmiotu << "\t\t" << wp->ocena << "\t\t" << wp->dataWpisu << endl;
    st->Head = wp->next;
    wp = wp->next;
}
Wcześniej oczywiście mam zdefiniowane, że wpisy* wp= st->Head;

Bardzo proszę o pomoc, bo szukałam już pomocy u znajomych jak i sama szukałam różnych rozwiązań, ale niestety bezskutecznie.
P-169323
Monika90
» 2018-02-08 20:44:38
Wg mnie to powinno być tak
C/C++
while( wp )
{
    //w środku bez zmian
}

Ale po co tam jest
st->Head = wp->next;
 to nie wiem.
P-169325
Dossja
Temat założony przez niniejszego użytkownika
» 2018-02-08 20:55:31
Niestety dalej pojawia się taki crash:

"Exception thrown at 0x0017FB7B in Dziekanat.exe: 0xC0000005: Access violation reading location 0xCDCDCDE1.

If there is a handler for this exception, the program may be safely continued."

Jeśli to pomoże to struktura wpisów stworzona jest tak:
C/C++
struct wpisy
{
    string nazwiskoProwadzacego;
    string nazwaPrzedmiotu;
    string ocena;
    string dataWpisu;
   
    wpisy * next;
};

A struktura studenta tak:
C/C++
struct student
{
    string imieS;
    string nazwiskoS;
    string nrAlbumu;
   
    student * next;
   
    wpisy * Head;
a później dalej w strukturze studenta mam funkcję dodająca wpisy:
C/C++
void dodajWpis( const string & przedmiot, const string & prowadzacy, const string & ocena, const string & data )
{
    wpisy * wp = new wpisy;
    wp->nazwiskoProwadzacego = prowadzacy;
    wp->nazwaPrzedmiotu = przedmiot;
    wp->ocena = ocena;
    wp->dataWpisu = data;
   
    //cout << wp->nazwiskoProwadzacego << wp->nazwaPrzedmiotu << wp->ocena << wp->dataWpisu << endl;
    wp->next = nullptr;
   
    if( Head == nullptr )
    {
        Head = wp;
    }
    else
    {
        wp->next = Head;
        Head = wp;
    }
}

Wrzucam to, bo możliwe, że mam tu błąd, który nie pojawia się na etapie sortowania itd., ale pojawia się na etapie zapisu :(

edit: a st->head był pozostałością po jednej z prób sprawienia żeby działało. Zapomniałam tego usunąć bo mi i tak nic nie zmieniało
P-169327
Monika90
» 2018-02-08 21:25:33
Najlepiej podaj całą funkcję w której jest ta pętla zapisująca do pliku.
P-169330
Dossja
Temat założony przez niniejszego użytkownika
» 2018-02-08 21:39:55
Proszę:
C/C++
void wypiszWszystko( student * & studentHead ) //zapisywanie danych do plików studentów
{
    ofstream plik;
    student * st = studentHead;
    for( st; st != nullptr; )
    {
        studentHead = studentHead->next;
       
        plik.open( st->nrAlbumu + ".txt" );
       
        plik << st->imieS << ' ' << st->nazwiskoS << endl << "Numer albumu: " << st->nrAlbumu << endl;
        wpisy * wp =( st->Head );
       
        while( wp )
        {
            plik << wp->nazwiskoProwadzacego << "\t\t" << wp->nazwaPrzedmiotu << "\t\t" << wp->ocena << "\t\t" << wp->dataWpisu << endl;
            wp = wp->next;
        }
        delete wp;
        plik.close();
        st = st->next;
    }
}
P-169331
Lora
» 2018-02-08 22:32:46
Ja bym wyrzucił linijkę studentHead = studentHead->next; ( jaki ona ma cel? ). Funkcja wypisz nie powinna modyfikować danych do niej przekazywanych ( po co w ogóle ta referencja w argumencie funkcji? ). A delete wp; nie ma żadnego efektu, bo próbujesz tam usuwać wskaźnik zerowy. Z resztą, tak jak wspomniałem, nie powinnaś tam nic usuwać, bo nazwa funkcji sugeruje tylko wypisanie danych, a nie ich modyfikację. Poza tym, zakładając, że listy st i wp kończą się null pointerem, to nic tutaj nie powinno wyrzucać wyjątku.
P-169333
pekfos
» 2018-02-10 17:19:52
» Kurs C++ / FAQNapisany program wysypuje się pytanie/odpowiedź
P-169363
« 1 »
  Strona 1 z 1