Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Tablica struktur problem z dopisywaniem.

Mathew2007 06 Lut 2010 01:48 1734 6
  • #1 06 Lut 2010 01:48
    Mathew2007
    Poziom 8  

    Code:
    typedef struct
    
    {
      char *w;
      char *z;
    } key_tab;

    key_tab *tab;


    Tworze taką tablicę struktur dopisuje co jakiś czas wyraz do tablicy-w i generuje jego zamiennik , ktory zapisuje jako z. po zapisaniu pierwszych wyrazow tablica wyglada tak :

    tab[0].w- wyraz1,tab[0].z- zamiennik1

    po zapisaniu drugiego wyrazu(wyraz2,zamiennik2) tablica wygląda tak:
    tab[0].w- wyraz2, tab[0].z- zamiennik2
    tab[1].w- wyraz2, tab[1].z- zamiennik2
    siedze nad tym już dłuższy czas i nie mogę sobie poradzić a jest to dla mie ważne.
    gdzie może być problem bardzo proszę o pomoc (z góry dzięki).

    0 6
  • Pomocny post
    #2 06 Lut 2010 11:45
    Sam Sung
    Poziom 30  

    Nie wkleiłeś kodu, więc mogę tylko strzelać, że nie alokujesz pamięci na nowe wyrazy, tylko zapisujesz je w tych samych miejscach pamięci, co stare. W rezultacie masz co prawda nową strukturę key_tab, ale z tymi samymi wskaźnikami.

    0
  • #3 06 Lut 2010 13:30
    Mathew2007
    Poziom 8  

    Code:
    void koduj(char *wd, key_tab *tab) //wd-wyraz
    
    {
       char zs[10];
       
       gn(zs,10); //generuje zamienniki wyrazu

       tab[lc].w = malloc (sizeof(char *));
       tab[lc].z = malloc (sizeof(char *));

       tab[lc].w = wd;
       tab[lc].z = zs;
       lc++;

    }


    Co robie źle może źle malloca użyłem ?? nie wiem :( lc jest zmienna zdefiniowaną w pliku nagłówkowym.

    i alokacja na całą strukture

    Code:
    tab = malloc (sizeof(key_tab *));

    0
  • Pomocny post
    #4 06 Lut 2010 15:28
    Sam Sung
    Poziom 30  

    Mathew2007 napisał:
    Co robie źle ??

    Wszystko.
    Alokujesz pamięć (2 bloki po 4 bajty), po czym gubisz otrzymane wskaźniki (wyciek pamięci) nadpisując je wartością z zewnątrz i wskaźnikiem do zmiennej lokalnej, który przestaje być ważny po wyjściu z funkcji.
    Do kopiowania stringów możesz w tym przypadku użyć funkcji strdup() z nagłówka <string.h> - zastąpi strlen(), malloc() i memcpy().

    0
  • #5 06 Lut 2010 16:04
    Mathew2007
    Poziom 8  

    mógłbyś jakiś przykład użycia tej funkcji podac :)?

    0
  • Pomocny post
    #6 06 Lut 2010 16:37
    Sam Sung
    Poziom 30  

    Mogę.

    Code:
    void koduj(const char *wd, key_tab *tab) //wd-wyraz
    
    {
       char zs[10];
       
       gn(zs,10); //generuje zamienniki wyrazu

       tab[lc].w = strdup(wd);
       tab[lc].z = strdup(zs);

       lc++;
    }

    0
  • #7 06 Lut 2010 16:45
    Mathew2007
    Poziom 8  

    dziękuje bardzo super :) pomogłeś , naprawde wielkie dzięki :D

    0