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.

ANSI C - Dynamiczna alokacja pamieci dla tablicy struktur poprzez funkcję

maciekkielbasa 30 Nov 2012 13:56 4716 9
  • #1
    maciekkielbasa
    Level 9  
    Witam.
    Problem polega na tym, że chcę wykorzystać zewnętrzną funkcję pobierającą wskaźnik, która alokuje mi pamięć, tak żebym mógł korzystać z niej w funkcji main. Debuger jednak pokazuje że w funkcji main nic się nowego nie tworzy, czyli funkcja nie podmienia (alokuje) tego co jest pod wskaźnikiem. Pytanie dlaczego? Jak temu zaradzić wykorzystując nadal zewnętrzną funkcję.
    Z góry dziękuję

    Code: c
    Log in, to see the code
    [/code]
  • Helpful post
    #2
    stanleysts
    Level 27  
    Bo wogóle pierwszy malloc nie może brać rozmiaru 6*sizeof(int) ale 6*sizeof(struct bazadanych *)
  • #3
    maciekkielbasa
    Level 9  
    Właśnie wymyśliłem dlaczego nie da się tego wykonać. Funkcja pobiera wskaźnik i tworzy jego kopię (tak jak kopiuje wartość jeśli pobiera zmienną). Czyli w tym przypadku pobiera NULL, co jest tak na prawdę niczym (nie odnosi się do żadnego miejsca w pamięci). W tym przypadku można by po prostu zaalokować pamieć w mainie, ale w rzeczywistości próbowałem się uporać z problemem alokacji pierwszej komórki listy, gdzie każda komórka posiada wskaźnik na kolejny element (oczywiscie za pomocą funkcji zewnętrznej).

    Code: c
    Log in, to see the code


    Jeśli to komuś pomoże, to proponuję w mainie stworzyć pierwszy element jako zmienną (nie wskaźnik) i nastepnie alokować pamięć dla kolejnych komórek (już w funkcjach zewnętrznych).
  • #4
    stanleysts
    Level 27  
    Bzdura i jest to w ogóle nie potrzebne.
  • #5
    maciekkielbasa
    Level 9  
    Prosiłbym chociaż o sprecyzowanie co jest bzdurą.
    Quote:
    Bo wogóle pierwszy malloc nie może brać rozmiaru 6*sizeof(int) ale 6*sizeof(struct bazadanych *)

    Faktycznie, pomyliłem się.

    Wrócę do problemu z dynamiczną alokacją przy tworzeniu listy. Zamieszczam tutaj skrócony kod w celu zwrócenia jedynie uwagi na utworzenie pierwszej komórki listy.
    Code: c
    Log in, to see the code


    W tym przypadku nie da się utworzyć pierwszej komórki, która byłaby zachowana na stale w pamięci (tworzy się jedynie w funkcji ale nie zostaje przypisana wskaźnikowi BazaStart, ponieważ na początku stanowił NULL o czym pisałem powyżej).
    Jeśli natomiast, mielibyśmy utworzoną zmienną jak w przykładzie poniżej, to można by dalej alokować pamieć dla kolejnych komórek, pobierając adres utworzonej zmiennej.
    Code: c
    Log in, to see the code


    Ktoś by mógł spytać po co tak kombinować. Zamieszczam tu uproszczone wersje kodów, którę w rzeczywistości posiadają jeszcze inne funkcje, a alokacja jest mi potrzebna choćby po to żeby móc usuwać pózniej poszczególne komórki.
  • #6
    Eagle
    Level 24  
    Quote:
    Ktoś by mógł spytać po co tak kombinować.


    To ja pytam nie możesz po prostu użyć listy z std dla swojej struktury ?

    Stracisz tylko czas, chyba że chcesz napisać swoją listę.

    Code: c
    Log in, to see the code
  • #7
    stanleysts
    Level 27  
    To co napisał kolega wyżej to pierwsza sprawa a druga jest taka, że się źle za to zabierasz
    bo tworzenie pierwszego elementu niczym nie różni się od tworzenia następnych.

    Code: c
    Log in, to see the code
  • #8
    maciekkielbasa
    Level 9  
    W zadaniu chodzi o stworzenie własnej listy i to w dodatku w języku C. Wydaje mi się, że używanie definicji listy dotyczy już C++.
    Quote:
    tworzenie pierwszego elementu niczym nie różni się od tworzenia następnych

    W twoim przykładzie funkcja pobiera wskaźnik (adres) i tworzy kolejny element. Chodzi o to, że za pomocą tej funkcji nie da się stworzyć żadnego rekordu, jeśli w mainie mamy tylko zadeklarowany wskaźnik i ten wskaźnik jest argumentem tej funkcji (bo tak jak pisałem wcześniej, jego adresem jest NULL). W takim razie wystarczy jak się zadeklaruje pierwszy element jako zmienną (może to być element zerowy który nie będzie zawierał żadnych informacji) albo jako wskaźnik, lecz tym razem musiałby on być zaalokowany w mainie bezpośrednio. W zasadzie muszę przyznać, że problem już rozwiązałem.
  • #9
    stanleysts
    Level 27  
    No tworzysz sobie w maine ale jako pierwszy element a nie jakies inty z kosmosu.
  • #10
    maciekkielbasa
    Level 9  
    Po dwu latach doświadczenia w programowaniu w C/C++
    wracam, żeby ostatecznie rozwiązać mój problem.

    Może odpowiem najpierw na pierwsze pytanie
    Quote:
    Problem polega na tym, że chcę wykorzystać zewnętrzną funkcję pobierającą wskaźnik, która alokuje mi pamięć, tak żebym mógł korzystać z niej w funkcji main. Debuger jednak pokazuje że w funkcji main nic się nowego nie tworzy, czyli funkcja nie podmienia (alokuje) tego co jest pod wskaźnikiem.

    A więc, rozwiązaniem tego problemu jest utworzenie funkcji zwracającej wskaźnik. Dotychczas używana funkcja pobierała wskaźnik, tworzyła wewnętrzną kopię, a na koniec, tej kopii przypisano nowy adres (z zaalokowaną pamiecią). Niestety taki zabieg nie zapewnia nadpisania pobieranego przez funkcję wskaźnika.
    Alternatywą staje się funkcja wyszczególniona poniżej
    Code: c
    Log in, to see the code

    Rozwiązaniem drugiego problemu, czyli utworzenie funkcji, która zaalokuje pamięć dla listy (choćby dla pierwszego elementu). Mając więcej doświadczenia w programowaniu, również w C++ napiszę funkcję, która uwzględnia utworzenie pierwszego elementu. Zostanie to zapewnione również poprzez zwracanie wskaźnika
    Code: c
    Log in, to see the code

    Na koniec dodam, że nie mogłem użyć dobrodziejstw C++, ponieważ był to problem związany z kursem na studiach, który dotyczył tylko programowania w C.