logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c++] Segmentation fault w C++ przy dynamicznej tablicy studentów

Eureka 170 02 Sty 2010 16:57 1727 4
REKLAMA
  • #1 7472983
    Eureka 170
    Poziom 22  
    Posty: 534
    Pomógł: 38
    Ocena: 15
    Mam taki program:
    #include <iostream>
    #include <string.h>
    #include <cstdlib>
    #include <conio.h>
    using namespace std;
    
    const int MAX = 100;
    const int stud = 300;
    struct student
    {
        char nazwisko[MAX], imie[MAX];
        int album;
    };
    
    student *tab[stud];
    
    int wypelnij(int b)
    {
    
    
        tab[b] = new student;
        cout << "Podaj imie studenta" << endl;
        cin >> tab[b]->imie;
        cout << "Podaj nazwisko studenta" << endl;
        cin >> tab[b]->nazwisko;
        cout << "Podaj numer albumu" << endl;
        cin >> tab[b]->album;
    }
    int znajdz(int b)
    {
        char im[MAX], nazw[MAX];
        cout << "Podaj imie szukanego studenta" << endl;
        cin >> im;
        cout << "Podaj nazwisko szukanego studenta" << endl;
        cin >> nazw;
        for( int i=0;i<b;i++)
        {
            if((strcmp(im, tab[i]->imie)==0) && (strcmp (nazw, tab[i]->nazwisko)==0))
            {
                cout << "Student ten znajduje sie na liscie, na " << i+1 << " pozycji" << endl;
            }
            if(i==b-1)
            {
                cout << "Nie znaleziono studenta" << endl;
            }
        }
    
    
    }
    int main()
    {
        int a,b=0,c=0,i=0,d;
    
      while(a!=5)
      {
        cout << "Wybierz opcje" << endl;
        cout << "1 – Wyswietl liste" << endl;
        cout << "2 – Dodaj studenta" << endl;
        cout << "3 – Znajdz studenta" << endl;
        cout << "4 – Usun studenta" << endl;
        cout << "5- Koniec" << endl;
        cout << endl;
        cout << "Twoj wybor to: ";
        cin >> a;
        switch(a)
        {
          case 1:
            cout << "Oto lista studentow:" << endl;
            for( int i=0; i<b;i++)
            {
                c=i+1;
                cout << c << ") " << tab[i]->imie << " " << tab[i]->nazwisko << " " << tab[i]->album << endl;
    
            }
            cout << endl;
            break;
          case 2:
            wypelnij(b);
            cout << endl;
            b++;
            break;
          case 3:
            znajdz(b);
            break;
         case 4:
            cout << "Podaj pozycje studenta na liscie, ktorego chcesz usunac" << endl;
            cin >> d;
           for(int e=d-1;e<b;e++)
           {
    
               strcpy(tab[e]->imie, tab[e+1]->imie);
               strcpy(tab[e]->nazwisko, tab[e+1]->nazwisko);
               tab[e]->album = tab[e+1]->album;
    
           }
    
           b--;
           break;
    
        }
    
      }
    
        system("PAUSE");
        return 0;
    }
    


    Jest to program, w którym jest "baza danych". Ma on możliwość wyświetlenia listy studentów, dodawania imienia, nazwiska i nr albumu studenta, znajdowania konkretnej osoby i usuwania studenta z listy. Niestety, kiedy wprowadzam do programu dane, a potem chcę usunąć jakąś pozycję, to program się zawiesza. Kiedy uruchamiam debuggera, to komunikuje mi on "segmentation fault". Myślę, że błąd jest w pętli:
    
    for(int e=d-1;e<b;e++)
           {
    
               strcpy(tab[e]->imie, tab[e+1]->imie);
               strcpy(tab[e]->nazwisko, tab[e+1]->nazwisko);
               tab[e]->album = tab[e+1]->album;
    
           }
    

    Jednak nie wiem, dlaczego. Jak można rozwiązać ten problem?
  • REKLAMA
  • #2 7473142
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    a gdzie zwalnianie pamięci? Poza tym skoro masz tablicę wskaźników to zmień tylko wartości wskaźników a nie kopiuj wszystko z miejsca na miejsce.
  • REKLAMA
  • #3 7473287
    Eureka 170
    Poziom 22  
    Posty: 534
    Pomógł: 38
    Ocena: 15
    Jestem początkujący, jeżeli chodzi o programowanie, więc czy mógłbyś sprecyzować to, co powiedziałeś?

    czy do tej pętli mam dodać:

    delete [] tab[e]->imie;
    delete [] tab[e]->nazwisko; ?
  • REKLAMA
  • #4 7473323
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    1. usuń tylko ten jeden element, a więc delete tab[e]; (to, co zapisałeś to usuwanie tablicy dynamicznej!)
    2. dokonaj przepisania wskaźników (tab[e]=tab[e+1])
  • #5 7473384
    Eureka 170
    Poziom 22  
    Posty: 534
    Pomógł: 38
    Ocena: 15
    Dzięki wielkie, działa! :)
REKLAMA