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

Programowanie obiektowe - problem z dynamiczną tablicą stringów w klasie

Ostatnio zmodyfikowano 2013-03-04 23:02
Autor Wiadomość
karpiq
Temat założony przez niniejszego użytkownika
» 2013-03-04 15:00:29
ok, dzięki za pomoc teraz już sobie poradzę ;)
P-77653
karpiq
Temat założony przez niniejszego użytkownika
» 2013-03-04 17:09:56
Sorry za double posta ale natrafiłem na kolejny problem:

C/C++
#include <iostream>
#include <string>
using namespace std;

class Student
{
public:
   
    string * Przedmioty;
    string Imie;
    string Nazwisko;
    int Nr_albumu;
    float Srednia;
    Student() { }
};

void nowy( Student * tab, int rozmiar )
{
    int i, j, n;
    Student * kopia = new Student[ rozmiar ];
    j = 0;
    for( i = 0; i < rozmiar; i++ )
    {
        kopia[ i ].Imie = tab[ i ].Imie;
        kopia[ i ].Nazwisko = tab[ i ].Nazwisko;
        kopia[ i ].Nr_albumu = tab[ i ].Nr_albumu;
        kopia[ i ].Srednia = tab[ i ].Srednia;
       
        j = 0;
        do
        {
            system( "pause" );
            kopia[ i ].Przedmioty[ j ] = tab[ i ].Przedmioty[ j ]; //<-------- To powoduje crash
            system( "pause" );
           
            j++;
        }
        while( tab[ i ].Przedmioty[ j ] != "koniec1133" );
       
    }
   
    Student * tablica = new Student[ rozmiar + 1 ];
   
    for( i = 0; i < rozmiar; i++ )
    {
        tab[ i ].Imie = kopia[ i ].Imie;
        tab[ i ].Nazwisko = kopia[ i ].Nazwisko;
        tab[ i ].Nr_albumu = kopia[ i ].Nr_albumu;
        tab[ i ].Srednia = kopia[ i ].Srednia;
       
        j = 0;
        do
        {
            tab[ i ].Przedmioty[ j ] = kopia[ i ].Przedmioty[ j ];
            j++;
        }
        while( tab[ i ].Przedmioty[ j ] != "koniec1133" );
       
        cout << "Dodawanie nowego studenta" << endl << endl;
        cout << endl << "Student nr. " << i + 1 << endl << "Imie: ";
        cin >> tablica[ i ].Imie;
        cout << "Nazwisko: ";
        cin >> tablica[ i ].Nazwisko;
        cout << "Nr. albumu: ";
        cin >> tablica[ i ].Nr_albumu;
        cout << "Srednia: ";
        cin >> tablica[ i ].Srednia;
        cout << "Ilosc przedmiotow: ";
        cin >> n;
        tablica[ i ].Przedmioty = new string[ n + 1 ];
       
        for( j = 0; j < n; j++ )
        {
            cout << "Przedmiot nr. " << j + 1 << ": ";
           
            cin >> tablica[ i ].Przedmioty[ j ];
        }
        tablica[ i ].Przedmioty[ j ] = "koniec1133";
       
    }
   
   
    system( "pause" );
}

void wypisz( Student * tab, int rozmiar )
{
    int i, j;
   
    for( i = 0; i < rozmiar; i++ )
    {
       
        cout << "Student nr. " << i + 1 << endl;
        cout << "Imie: " << tab[ i ].Imie << endl;
        cout << "Nazwisko: " << tab[ i ].Nazwisko << endl;
        cout << "Nr. albumu: " << tab[ i ].Nr_albumu << endl;
        cout << "Srednia: " << tab[ i ].Srednia;
       
        j = 0;
        do
        {
            cout << endl << "Przedmiot nr. " << j + 1 << ": ";
            cout << tab[ i ].Przedmioty[ j ];
           
            j++;
        }
        while( tab[ i ].Przedmioty[ j ] != "koniec1133" );
       
        cout << endl << endl;
        system( "pause" );
        system( "cls" );
    }
   
}




int main()
{
    int j, i, n, K;
   
    cout << "Podaj liczbe studentow: ";
    cin >> K;
    system( "cls" );
    Student * tablica = new Student[ K ];
   
    for( i = 0; i < K; i++ )
    {
        cout << endl << "Student nr. " << i + 1 << endl << "Imie: ";
        cin >> tablica[ i ].Imie;
        cout << "Nazwisko: ";
        cin >> tablica[ i ].Nazwisko;
        cout << "Nr. albumu: ";
        cin >> tablica[ i ].Nr_albumu;
        cout << "Srednia: ";
        cin >> tablica[ i ].Srednia;
        cout << "Ilosc przedmiotow: ";
        cin >> n;
        tablica[ i ].Przedmioty = new string[ n + 1 ];
       
        for( j = 0; j < n; j++ )
        {
            cout << "Przedmiot nr. " << j + 1 << ": ";
           
            cin >> tablica[ i ].Przedmioty[ j ];
        }
        tablica[ i ].Przedmioty[ j ] = "koniec1133";
        system( "cls" );
    }
    int x = 1;
    do
    {
        int menu;
       
        system( "cls" );
       
        cout << "1. Dodanie nowego studenta" << endl;
        cout << "2. Wyswietlenie danych" << endl;
        cout << "3. Zapisanie danych do student.txt" << endl;
        cout << "4. Wylacza program i kasuje dane." << endl;
        cin >> menu;
       
        switch( menu )
        {
           
        case 1:
            system( "cls" );
            nowy( tablica, K );
            break;
           
        case 2:
            system( "cls" );
            wypisz( tablica, K );
            break;
           
        case 3:
            system( "cls" );
           
            break;
           
        case 4:
            x = 2;
            break;
        }
    }
    while( x != 2 );
   
    return 0;
}

Instrukcja: kopia.Przedmioty[j]=tab.Przedmioty[j]; w funkcji nowy powoduje crash programu. Wcześniej są użyte bardzo podobne instrukcje i działają... Jakieś pomysły?
P-77671
unimator
» 2013-03-04 17:45:18
1.
C/C++
Student * kopia = new Student[ rozmiar ];
W ten sposób utworzysz tablicę o tym samym rozmiarze co oryginał. Nie wiem czy taki był Twój zamiar, ale rzucając oko na kod i wcześniejsze posty nie wydaje mi się.

2.
C/C++
tab[ i ].Przedmioty[ j ] != "koniec1133"
Coś takiego porówna Ci znak (lub liczbę, zależnie od interpretacji) z bodajże adresem stringu w sekcji danych programu (chociaż nie jestem tego pewien bo nie znam się na niskopoziomowym programowaniu i tych sprawach więc nie wiem czy aby na pewno tam będzie przechowany ten string). Tak czy inaczej, nie porównuje się tak stringów. Służy do tego funkcja np. memcmp lub strcmp. Chodzi po prostu o to by porównywać znak po znaku.
Dobrze by było, żebyś się zapoznał z zagadnieniem konstruktorów kopiujących.
P-77675
Monika90
» 2013-03-04 17:56:30
C/C++
tab[ i ].Przedmioty[ j ] != "koniec1133"
@unimator
To prawidłowo porównuje stringi.

Dobrze by było, żebyś się zapoznał z zagadnieniem konstruktorów kopiujących.
Dobrze by było gdyby użył std::vector, wtedy nie musiałby pisać, ani konstruktora kopiującego, ani destruktora.
P-77678
usmiech
» 2013-03-04 18:43:32
Ze stringami trzeba mocno uwazac :)
P-77680
karpiq
Temat założony przez niniejszego użytkownika
» 2013-03-04 21:47:47
Coś pokombinowałem, rozwiązałem tamten problem ale oczywiście natrafiłem na nowy -.-.

C/C++
#include <iostream>
#include <string>

using namespace std;

class Student
{
public:
   
    string * Przedmioty;
    string Imie;
    string Nazwisko;
    int Nr_albumu;
    float Srednia;
    Student() { }
};

void nowy( Student * tab, int rozmiar, int ilP[] )
{
    int i, j, n;
    Student * kopia = new Student[ rozmiar ];
    j = 0;
    for( i = 0; i < rozmiar; i++ )
    {
        kopia[ i ].Imie = tab[ i ].Imie;
        kopia[ i ].Nazwisko = tab[ i ].Nazwisko;
        kopia[ i ].Nr_albumu = tab[ i ].Nr_albumu;
        kopia[ i ].Srednia = tab[ i ].Srednia;
        kopia[ i ].Przedmioty = new string[ ilP[ i ] ];
        j = 0;
        do
        {
            kopia[ i ].Przedmioty[ j ] = tab[ i ].Przedmioty[ j ];
            j++;
        }
        while( j < ilP[ i ] );
       
    }
   
    Student * tablica = new Student[ rozmiar + 1 ];
   
    for( i = 0; i < rozmiar; i++ )
    {
        tab[ i ].Imie = kopia[ i ].Imie;
        tab[ i ].Nazwisko = kopia[ i ].Nazwisko;
        tab[ i ].Nr_albumu = kopia[ i ].Nr_albumu;
        tab[ i ].Srednia = kopia[ i ].Srednia;
       
        tab[ i ].Przedmioty = new string[ ilP[ i ] ];
       
        j = 0;
        do
        {
            tab[ i ].Przedmioty[ j ] = kopia[ i ].Przedmioty[ j ];
            j++;
        }
        while( j < ilP[ i ] );
       
    }
    cout << "Dodawanie nowego studenta" << endl << endl;
    cout << endl << "Student nr. " << i << endl << "Imie: ";
    cin >> tablica[ i ].Imie;
    cout << "Nazwisko: ";
    cin >> tablica[ i ].Nazwisko;
    cout << "Nr. albumu: ";
    cin >> tablica[ i ].Nr_albumu;
    cout << "Srednia: ";
    cin >> tablica[ i ].Srednia;
    cout << "Ilosc przedmiotow: ";
    cin >> n;
    tablica[ i ].Przedmioty = new string[ n ];
   
    for( j = 0; j < n; j++ )
    {
        cout << "Przedmiot nr. " << j + 1 << ": ";
        cin >> tablica[ i ].Przedmioty[ j ];
    }
    system( "pause" );
}

void wypisz( Student * tab, int rozmiar, int ilP[] )
{
    int i, j;
   
    for( i = 0; i < rozmiar; i++ )
    {
       
        cout << "Student nr. " << i + 1 << endl;
        cout << "Imie: " << tab[ i ].Imie << endl;
        cout << "Nazwisko: " << tab[ i ].Nazwisko << endl;
        cout << "Nr. albumu: " << tab[ i ].Nr_albumu << endl;
        cout << "Srednia: " << tab[ i ].Srednia;
       
        j = 0;
        do
        {
            cout << endl << "Przedmiot nr. " << j + 1 << ": ";
            cout << tab[ i ].Przedmioty[ j ];
           
            j++;
        }
        while( j < ilP[ i ] );
       
        cout << endl << endl;
        system( "pause" );
        system( "cls" );
    }
}

int main()
{
    int j, i, n, K;
    int przed[ 1000 ];
   
    cout << "Podaj liczbe studentow: ";
    cin >> K;
    system( "cls" );
    Student * tablica = new Student[ K ];
   
    for( i = 0; i < K; i++ )
    {
        cout << endl << "Student nr. " << i + 1 << endl << "Imie: ";
        cin >> tablica[ i ].Imie;
        cout << "Nazwisko: ";
        cin >> tablica[ i ].Nazwisko;
        cout << "Nr. albumu: ";
        cin >> tablica[ i ].Nr_albumu;
        cout << "Srednia: ";
        cin >> tablica[ i ].Srednia;
        cout << "Ilosc przedmiotow: ";
        cin >> n;
        przed[ i ] = n;
        tablica[ i ].Przedmioty = new string[ n ];
       
        for( j = 0; j < n; j++ )
        {
            cout << "Przedmiot nr. " << j + 1 << ": ";
           
            cin >> tablica[ i ].Przedmioty[ j ];
        }
        system( "cls" );
    }
    int x = 1;
    do
    {
        int menu;
       
        system( "cls" );
       
        cout << "1. Dodanie nowego studenta" << endl;
        cout << "2. Wyswietlenie danych" << endl;
        cout << "3. Zapisanie danych do student.txt" << endl;
        cout << "4. Wylacza program i kasuje dane." << endl;
        cin >> menu;
       
        switch( menu )
        {
           
        case 1:
            system( "cls" );
            nowy( tablica, K, przed );
            //cout<<tablica[K].Imie;
            K++;
            break;
           
        case 2:
            system( "cls" );
            wypisz( tablica, K, przed );
            break;
           
        case 3:
            system( "cls" );
           
            break;
           
        case 4:
            x = 2;
            break;
        }
    }
    while( x != 2 );
   
    return 0;
}

Program na początku wczytuje dane. Działa funkcja nowy()(dodaje nowe dane).
Problem występuje, gdy chcę wyświetlić dane funkcją wypisz() po wprowadzeniu danych za pomocą funkcji nowy(). Wydaje mi się, że funkcja nowy() nie zapisuje poprawnie wprowadzone dane.

P-77693
pekfos
» 2013-03-04 21:54:44
bodajże klasa std::vector działa na zasadzie takich list albo udostępnia taki mechanizm
Raczej
std::list
.
std::vector
 to tablica.
P-77694
karpiq
Temat założony przez niniejszego użytkownika
» 2013-03-04 21:58:52
Nie da rady bez vectora? Mam mało czasu a wtedy bym musiał przerobić cały program (i nauczyć się co to ten vector jest i z czym się go je).
P-77695
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona