Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Dynamiczna tablica struktur danych

rafalkosc 23 Mar 2009 22:27 4360 7
  • #1
    rafalkosc
    Level 13  
    Witam

    Mam spory problem z tablicą struktur. Otóż mam za zadanie odczytać z pliku, ile zawiera on struktur danych i następnie te dane posortować. Czyli, wygodnie by było w tablicę te struktury umieścić, a że powiedziane jest, że liczba jest podana w pliku, muszę ją stworzyć jako dynamiczną. I tu zaczynają się dla mnie schody. O ile dynamiczną tablicę np. liczb udało mi stworzyć, o tyle ze strukturami sobie nie poradzę.

    Proszę o pomoc i z góry dziękuję
  • Helpful post
    #2
    mykhaylo
    Level 14  
    Skoro nie radzisz sobie z tablicą, to może wykorzystaj vector lub list.
    Są to dynamiczne kolekcje oraz generyczne, więc nie będzie żadnego problemu aby ich użyć.
  • #3
    rafalkosc
    Level 13  
    Dzięki za odpowiedź.

    Doszedłem już do tego, w zasadzie cały program już napisałem, tylko głupia rzecz mnie zatrzymała.
    Nie wiem jak sensownie porównać element tablicy struktu, będący ciągiem znaków z jawnie wpisanym ciągiem. Może to wina tego, że w strukturze jest sztywny rozmiar?

    fragment kodu:

    if ((*(plyta+pl)).nosnik == "CD") printf("CD\n"); else //(*nosnik).CD++; else
    if ((*(plyta+pl)).nosnik == "DVD") printf("DVD\n"); else //(*nosnik).DVD++; else
    if ((*(plyta+pl)).nosnik == "LP") printf("LP\n"); else //(*nosnik).LP++; else
    if ((*(plyta+pl)).nosnik == "EP") printf("EP\n");

    PS Nie wiem, dlaczego dodało plik z rozeszerzeniem rar, w każdym razie, jest to tekstowy plik.
  • Helpful post
    #4
    BoskiDialer
    Level 34  
    rafalkosc wrote:
    if ((*(plyta+pl)).nosnik == "CD")

    Zastanawiam się, czy porównujesz ciągi znaków, czy raczej adresy na ciągi znaków (które mogą i przeważnie są różne, nawet pomimo że ciągi znaków są jednakowe). Poszukaj funkcji do porównywania dwóch ciągów.
  • #6
    rafalkosc
    Level 13  
    Dziękuję bardzo za odpowiedź, zadziałało ze strcmp :D Co prawda wcześniej próbowałem z nią w tej części kodu, ale musiałem coś źle wtedy zrobić.

    Został mi ostatni problem, właśnie zliczanie. Słabo znam C, w zasadzie się go uczę na tym programie i zapewne coś źle robię. Może macie pomysł?

    typedef struct liczba_nosnikow
    {
    int CD;
    int DVD;
    int LP;
    int EP;
    };
    struct liczba_nosnikow nosnik = {0, 0, 0, 0};


    if ((strcmp((*(plyta+pl)).nosnik, "CD")) == 0) (nosnik.CD)++; else
    if ((strcmp((*(plyta+pl)).nosnik, "DVD")) == 0) (nosnik.DVD)++; else
    if ((strcmp((*(plyta+pl)).nosnik, "LP")) == 0) (nosnik.LP)++; else
    if ((strcmp((*(plyta+pl)).nosnik, "EP")) == 0) (nosnik.EP)++;
  • #7
    mykhaylo
    Level 14  
    A jaki jest dokładnie problem ? Może to nie jest wina po stronie tego kawałka kodu co przedstawiłeś. Ogólnie inkrementacja w C nie zawodzi.
    Nie znam C za dobrze ale Twój sposób zainicjowania struktury wzbudził we mnie kontrowersje. Zawsze byłem przyzwyczajony do używania funkcji malloc w takich przypadkach.
    Code:

            liczba_nosnikow *ln = (liczba_nosnikow*)malloc(sizeof(liczba_nosnikow));
       ln->CD = 0;
       ln->CD++;
       printf("%d\n", ln->CD);
  • #8
    rafalkosc
    Level 13  
    Dzięki za odpowiedź. Szczerze mówiąć, użycie wskaźników w ogóle do mnie nie trafiało (same wskaźniki jak najbardziej, dobra rzecz), więc stąd te dziwne rzeczy. Już sobie poradziłem. Wrzucę ostateczny kod.
    Jeszcze raz dzięki za zainteresowanie i pozdrawiam!