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

Realokacja dynamicznej tablicy

Ostatnio zmodyfikowano 2016-11-04 17:22
Autor Wiadomość
lizardr
Temat założony przez niniejszego użytkownika
Realokacja dynamicznej tablicy
» 2016-11-04 02:37:49
C/C++
#include <iostream>
#include <conio.h>
#include <string>

using namespace std;


struct pracownik
{
    string imie;
    string nazwisko;
};

void create( pracownik ** & wskaznik, int n )
{
    int i;
    wskaznik = new pracownik *[ n ];
    for( i = 0; i < n; i++ )
         wskaznik[ i ] = new pracownik;
   
}

void destroy( pracownik ** & wskaznik, int n )
{
    int i;
    for( i = 0; i < n; i++ )
         delete wskaznik[ i ];
   
    delete[] wskaznik;
    wskaznik = 0;
   
}

void add( pracownik ** & lista, int & n )
{
    pracownik ** tmp = 0;
    create( tmp, n + 1 );
    copy( lista, lista + n, tmp );
    destroy( lista, n );
    lista = tmp;
    n++;
}

void zobacz( pracownik ** lista, int n )
{
    int i;
    for( i = 0; i < n; i++ )
    {
        cout << i + 1 << ". " << lista[ i ]->imie << " " << lista[ i ]->nazwisko << endl;
    }
}

void modyfikuj( pracownik ** lista )
{
    int n;
   
    cout << "podaj numer pracownika ktorego chcesz edytowac: " << endl;
    cin >> n;
    n--;
    cout << "Imie: " << endl;
    cin.sync();
    cin >> lista[ n ]->imie;
    cout << "Nazwisko: " << endl;
    cin.sync();
    cin >> lista[ n ]->nazwisko;
}


int main();
{
    pracownik ** lista_pracownikow = 0;
    int n_pracownik = 5;
    bool dodaj = 0;
    bool edytuj = 0;
   
    create( lista_pracownikow, n_pracownik );
   
    zobacz( lista_pracownikow, n_pracownik );
   
    cout << "edytowac? 0.Nie 1.Tak" << endl;
    cin >> edytuj;
    if( edytuj )
         modyfikuj( lista_pracownikow );
   
    cout << "dodac nowy? 0.Nie 1.Tak" << endl;
    cin >> dodaj;
    if( dodaj )
         add( lista_pracownikow, n_pracownik );
   
    zobacz( lista_pracownikow, n_pracownik );
   
    cin.sync();
    cin.get();
   
    destroy( lista_pracownikow, n_pracownik );
    return 0;
}

Witam, mam problem w funkcji add(). Funkcja w założeniu miała realokować pamięć o jeden element więcej z zachowaniem poprzednich. Kod kompiluje się dobrze, funkcja zobacz() przed realokacjom działa poprawnie natomiast po realokacji wyświetla jakieś losowe śmieci i program crashuje. Próbowałem jeszcze w innej wersji a mianowicie:

C/C++
void add( pracownik ** & lista, int & n )
{
    pracownik ** tmp = 0;
    create( tmp, n + 1 );
    copy( lista, lista + n, tmp );
    destroy( lista, n );
    create( lista, n + 1 );
    copy( tmp, tmp + n, lista );
    destroy( tmp, n + 1 );
    n++;
}

W tej wersji program nie crashuje, pokazuje dobrą ilość pozycji ale po realokacji wyświetla pod tymi pozycjami tylko śmieci.

Edit. Wiem że można to dużo łatwiej zrobić wektorem, ale dostaliśmy na uczelni zakaz używania go żeby się nauczyć nisko-poziomowo.
P-153349
mateczek
» 2016-11-04 05:59:23
C/C++
void add( pracownik ** & lista, int & n )
{
    pracownik ** tmp = 0;
    create( tmp, n + 1 );
    for( int i = 0; i < n; i++ ) {
        tmp[ i ]->imie = lista[ i ]->imie;
        tmp[ i ]->nazwisko = lista[ i ]->nazwisko;
    }
    destroy( lista, n );
    lista = tmp;
    n++;
}


//chyba by łatwiej było na

pracownik tablica[] //czyli  tablicy obiektów a nie wskaźników
P-153350
lizardr
Temat założony przez niniejszego użytkownika
» 2016-11-04 17:22:40
Okej, poeksperymentowałem trochę i wygląda na to że problem leżał w mojej funkcji destroy() która to usuwała obiekty które chwilę wcześniej przypisałem do **tmp. Przynajmniej tak mi się wydaje, poprawcie mnie jeśli się mylę. Tak więc jedno rozwiązanie na które wpadłem to po prostu użyć samego delete []:

C/C++
void add( pracownik ** & lista, int & n )
{
    pracownik ** tmp = 0;
    create( tmp, n + 1 );
    copy( lista, lista + n, tmp );
    delete[] lista;
    lista = tmp;
    n++;
}

albo tak jak sugerował @mateczek skopiować całe obiekty do tmp pętlą i nie bawić się w copy():

C/C++
void add( pracownik ** & lista, int & n )
{
    pracownik ** tmp = 0;
    create( tmp, n + 1 );
    for( int i = 0; i < n; i++ )
         * tmp[ i ] = * lista[ i ];
   
    destroy( lista, n );
    lista = tmp;
    n++;
}

Martwię się tylko czy w którymś miejscu nie mam wycieków pamięci, sprawdzałem w cppcheck i niby wszystko okej. Also @mateczek, racja że tablicą obiektów było by łatwiej tylko że prowadzący kazał nam w projekcie użyć między innymi właśnie tablicy wskaźników więc zacząłem od tego.
P-153369
« 1 »
  Strona 1 z 1