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

Realokacja pamięci

Ostatnio zmodyfikowano 2016-03-23 08:03
Autor Wiadomość
Blonnik
Temat założony przez niniejszego użytkownika
Realokacja pamięci
» 2016-03-22 21:56:20
Cześć
Mam strukturę słowo :
C/C++
typedef struct slowo {
    char ang[ N ];
    char pol[ N ];
} slowo;

Mam też strukturę lista :
C/C++
typedef struct lista {
    slowo ** s; //1-wymiarowa tablica wskaźników do struktury slowo
    int n; //liczba elementów listy
    sort jak_posortowana; //enum mówiący o sposobie sortowania
} lista;

Moim zadaniem jest zaimplementowanie funkcji dopisz, która będzie częścią funkcji init (która ma stworzyć listę słów).
Funkcja dopisz ma za zadanie wstawienie jednej struktury slowo do listy L i powinna zadbać o rozszerzenie pamięci tablicy wskaźników o 1 i przydzielić pamięć na nowe słowo oraz skopiować dane.

Tak wygląda funkcja init :
C/C++
int init( lista * L, slowo * slowka_dnia, int n ) {
    int i;
   
    for( i = 0; i < n; i++ )
         if( !dopisz( L, slowka_dnia[ i ] ) ) return 0;
   
    L->jak_posortowana = BRAK;
    L->n = n;
    return 1;
}

A tak wygląda moja funkcja dopisz :
C/C++
int dopisz( lista * L, slowo s ) {
    //uzupełnij
    //1 dodatkowa alokacja
    L->s =( slowo ** ) realloc( L->s,( L->n + 1 ) * sizeof( slowo * ) ); // alokacja n+1 bloków wilekosci wskaznika na strukture slowo
    //2 wstawienie slowa na liste
    slowo ** wsk = L->s; //pomocniczy wskaznik
    **( wsk + L->n ) = s; //wpisanie na nowo zaalkowaną pozycję
    return 1;
}

Ogólnie wywala mi program po udanym odpaleniu :/
Mojego autorstwa jest tylko funkcja dopisz, więc na 100% w niej siedzi błąd.
Macie jakieś pomysły ?
P-146437
darko202
» 2016-03-23 08:03:13
1.
nie wiem co chciałeś zrobić i dlaczego tak
ale wydaje się ze nie rozumiesz jak jest zbudowana i jak działa lista
 
przeczytaj sobie jak dodaje się kolejny element listy np. na 
http://www.p-programowanie.pl​/cpp/lista-jednokierunkowa-c/
w szczególności podpunkt
"Dodawanie elementów do listy"

U Ciebie musi to być zrobione analogicznie

inny przykład
http://www.algorytm.org​/klasyczne/lista/lista-1-c.html


2.
funkcja realloc
http://www.cplusplus.com​/reference/cstdlib/realloc/

Changes the size of the memory block pointed to by ptr.
The function may move the memory block to a new location (whose address is returned by the function).

"move" to po polsku przesuń, a nie zaalokuj pamięć na nowy element listy.
"Changes the size" - zmienia rozmiar 

przy dodawaniu nowego elementu trzeba zarezerwować nową pamięć na ten element
P-146455
« 1 »
  Strona 1 z 1