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

C++ dynamiczna alokacja tablic struktur

Ostatnio zmodyfikowano 2016-03-24 11:31
Autor Wiadomość
sebuzinski
Temat założony przez niniejszego użytkownika
C++ dynamiczna alokacja tablic struktur
» 2016-03-24 10:48:38
Witam,
to mój pierwszy post na forum :) Proszę o wyrozumiałość.

Rozpoczynam naukę dynamicznej alokacji pamięci i stworzyłem poniższy program, niestety metodą wielu prób i błędów. Program się kompiluje, ale nie wiem czy to dobrze :) Nadal mam kilka niejasności i problemów, przez które nie mogę przebrnąć. Program ma za zadanie dodawać do listy kolejne połączenia.

C/C++
< div > using namespace std;

struct dane
{
    int nr;
    int dt;
};
void wyswietl( dane lista[], int ile );
void dodaj( dane lista[], int & ile );

main()
{
    int ile = 0;
    dane * lista = NULL;
    lista = new dane[ ile ]; //rozumiem, że stworzyłem wskaźnik na jakies miejsce w pamięci
    //i nawet jesli tablica ma zero elementów mogę ją przekazac
    //do funkcji czy pracować na niej jak przy utworzeniu wartosci dla lista[0]?
    //lista[0].nr=666;
    //lista[0].dt=666;
    cout << "wybierz operacje\n";
    int x;
    while( x != 3 )
    {
        cout << "1. wyswietl liste\n";
        cout << "2. dodaj numer\n";
        cout << "3. zamknij program\n";
        cin >> x;
        switch( x )
        {
        case 1: { wyswietl( lista, ile ); break; }
        case 2: { dodaj( lista, ile ); break; }
        case 3: { exit( 1 ); }
        }
    }
}

void dodaj( dane lista[], int & ile )
{
    dane * zast = new dane[ ile ];
    for( int i = 0; i < ile; i++ )
    {
        zast[ i ].nr = lista[ i ].nr;
        zast[ i ].nr = lista[ i ].dt;
    }
    ile++; //w tym momencie tablica lista[], którą alokowałem w funkcji main
    //została powiększona?
    for( int i = 0; i < ile - 1; ++i )
    {
        lista[ i ].nr = zast[ i ].nr;
        lista[ i ].dt = zast[ i ].nr;
    }
   
    cin >> lista[ ile ].nr;
    cin >> lista[ ile ].dt;
}

void wyswietl( dane lista[], int ile )
{
    for( int i = 1; i < ile + 1; i++ ) //jak pozbyc sie smieci ktore są w lista[0]?
    //tzn przypisac im pierwsza dodawaną wartosc w funkcji dodaj()
    { cout << "osoba:" << i << endl;
        cout << lista[ i ].nr << endl;
        cout << lista[ i ].dt << endl;
    }
}
</ div >
P-146484
carlosmay
» 2016-03-24 11:05:29
Program się kompiluje, ale nie wiem czy to dobrze :) Nadal mam kilka niejasności i problemów, przez które nie mogę przebrnąć.
Z czy konkretnie jest problem.

Pierwsze z brzegu. Tablica ma rozmiar 0.
C/C++
int ile = 0;
dane * lista = NULL;
lista = new dane[ ile ]; // ile wynosi 0
P-146486
j23
» 2016-03-24 11:31:48
C/C++
ile++; //w tym momencie tablica lista[], którą alokowałem w funkcji main została powiększona?

Nie, bo niby dlaczego miałaby być powiększona? ile i lista to dwie różne zmienne. Poprawny algorytm wygląda tak:
1. stwórz tablicę ile+1 elementową.
2. skopiuj ile elementów ze starej tablicy do nowej.
3. usuń starą tablicę.
4. powiększ ile o jeden.
5. zwróć nową tablicę.
P-146488
« 1 »
  Strona 1 z 1