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.

ANSI C - Przekazywanie początku listy innej funkcji

jowyma 14 Sty 2015 21:16 636 2
  • #1 14 Sty 2015 21:16
    jowyma
    Poziom 22  

    Mam właściwie dwie prośby w tym poście. Pierwsza to czy ktoś zna proste wyjaśnienie ile gwiazdek lub ampersandów stosować przy przekazywaniu wskaźników do funkcji. Podobno wystarcza kartka w kratkę i 30 minut. Mimo przeczytania książki Stephena Praty nadal głupieję ile gwiazdek i ampersandów stosować.
    Druga prośba to konkretny przykład tego, czego nie rozumiem. W main tworzę pierwszy wskaźnik do elementu listy (czyli głowę kolejki), w zewnętrznej przydzielam pamięć, dodaję kolejne elementy i wypełniam jakąś wartością elementy listy.
    W komentarzu jest napisane czego nie rozumiem. Chodzi o przekazywanie adresu do wskaźnika stworzonego w main kolejnym funkcjom pomiędzy sobą. Robię to metodą prób i błędów co mnie dobija.
    Jeszcze rozumiem, że w main wywołanie jest Funkcja(&wskaźnik). Wtedy Funkcja(typ ** wskaźnik). Bo dostaje adres (wpisany gdzieś, czyli robi się kolejny wskaźnik) wskaźnika.
    Ale potem jak w Funkcja chcę przekazać ten wskaźnik kolejnej funkcji to co zrobić i DLACZEGO. Ile gwiazdek czy ampersandów i dlaczego. I dlaczego jak podstawiam pod wskaźnik nową zmienną, to już wywołanie kolejnej funkcji nie działa poprawnie. Ratujcie moją biedną głowę.


    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Tutaj cały program

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Żeby program działał potrzebny jest dodatkowo plik ze słownikiem polskim, który załączam do posta.

    0 2
  • Pomocny post
    #2 14 Sty 2015 23:15
    ania13L
    Poziom 12  

    W C dawno nie pisalam wiec moge sie mylic (od razu zaznaczam).
    W kazdym razie odnosnie pierwszego pytania to chyba dobrze rozumujesz - ze musi byc wskaznik na wskaznik poniewaz ten "wewnetrzny" mozesz modyfikowac. I dlatego trzeba przekazywac lista**

    Odnosnie drugiego pytania: tego zawartego w komenatrzu w kodzie. Do funkcji WypelniajListe() przekazujesz pointerhead ktory jest typu lista** i argumentu takiego samego typu oczekuje funckja KopiujDoKolejki. Wiec to juz jest wskaznik na wskaznik i starczy go tylko przekazac. Jesli zrobisz &pointerhead to pobierzesz adres wskaznika na wskaznik i wynikowo otrzymasz lista*** (i dalej sie wszytsko juz posypie poniewaz bedziesz juz pisal w zle miejsca pamieci).

    O ile moge cos doradzic to jakiego uzywasz programu do pisania w C? Nie wiem jak jest w innych ale ja uzywam CodeBlocksa i tam jesli wezmiesz w opcjach kompilacji pedantic i -Wall to ten drugi problem o ktory pytales kompilator zglasza. Wiec by bylo latwiej :)

    Druga rada chociaz to raczej anty-pattern ale ja zawsze jak pisalam w C szlam na latwizne. Jesli sie pogubisz ze wskaznikami na poczatek kolejki to wez ten poczatek zrob jak zmienna globalna. To rozwiazuje problemy z przekazywaniem go do funkcji - chociaz nie pozwala dobrze zrozumiec. Ale jesli np nie bedzie Ci dzialac kod na kolokwium to dobrze moze miec rozwiazanie awaryjne :)

    -1
  • #3 15 Sty 2015 00:26
    jowyma
    Poziom 22  

    Przepięknie dziękuję za to wyjaśnienie, wreszcie mi się trochę w mózgownicy przejaśniło.
    Co do zmiennych globalnych to nie wolno nam używać, a piszemy programy pod Linuksem i gcc. Sprawdzę czy CodeBlocks ma wersję na Linuksa.

    0