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 - Lokalnie zdefiniowana tablica i struktura

jowyma 26 Lis 2014 22:47 705 4
  • #1 26 Lis 2014 22:47
    jowyma
    Poziom 22  

    Czy ktoś z forumowiczów mógłby rozwiać moje wątpliwości na które nie potrafię znaleźć jednoznacznej odpowiedzi?
    Chodzi o tablice i struktury tworzone w C. Czy jeżeli stworzę je lokalnie w ramach jakiejś funkcji a nie globalnie to one będą widoczne i ich wartości pamiętane nawet jak wyjdę z tej funkcji?
    A jeżeli je przekazuję jako argument do jakiejś funkcji to przy tablicy zawsze przekazuję oryginalną wartość i ona jest modyfikowana, a jak to jest ze strukturą? Muszę przekazywać funkcji wskaźnik do struktury aby funkcja pracowała na oryginale czy automatycznie zawsze i tak funkcja zmienia oryginalną wartość i nie pracuje na kopii?

    0 4
  • Pomocny post
    #2 27 Lis 2014 12:26
    mcvsama
    Poziom 15  

    Wszystkie zmienne automatyczne w funkcjach są niszczone po wyjściu z funkcji. Jeśli chcesz, żeby funkcja tworzyła strukturę i ją jakoś zwróciła, to w C zazwyczaj robi się to brzydko:
    - strukturę deklaruje (lub alokuje) się na zewnątrz funkcji, a do funkcji podaje wskaźnik do niej, żeby funkcja tę strukturę zainicjalizowała;
    - na zewnątrz funkcji deklaruje się wskaźnik do struktury i do funkcji podaje wskaźnik do wskaźnika. Funkcja alokuje strukturę na stercie i przypisuje to co zaalokowała pod wskaźnik zapodany z zewnątrz (za pomocą wskaźnika do wskaźnika), tak że ten wskaźnik na zewnątrz już po wyjściu z funkcji będzie wskazywał na strukturę. Łomatko… Wtedy ten, kto wywołał funkcję jest odpowiedzialny za dealokację struktury.
    - funkcja może zaalokować strukturę i zwrócić wskaźnik do niej. Podobnie jak wyżej, tylko mniej zabaw ze wskaźnikami. Tutaj również „wołający” jest odpowiedzialny za dealokację.

    Mogę się mylić, ale od któregoś momentu chyba w C funkcje mogą zwracać struktury tak jak w C++ - przez wartość. To już jest całkiem niezłe rozwiązanie jeśli chodzi o czytelność i błędogenność, ale wolniejsze niż zabawy ze wskaźnikami, bo struktura musi być skopiowana… no chyba że optymalizator zrobi jakąś magię ze stosem - np. według podobnej idei jak cplusplusowe Return Value Optimization - nie wiem, czy kompilatory/optymalizatory C też takie rzeczy implementują.

    Jeśli przekażesz strukturę przez wartość, to funkcja ją sobie skopiuje (bajt po bajcie) i nie zmodyfikujesz oryginalnej z wnętrza funkcji. Jeśli chcesz ją modyfikować, przekaż jej wskaźnik.

    Co do tablic, to one są de facto wskaźnikami, dlatego modyfikuje się ich oryginalna zawartość.

    0
  • #3 27 Lis 2014 16:29
    jowyma
    Poziom 22  

    Jeżeli mogę o coś jeszcze podpytać dla pewności...
    Na razie mam tak, że strukturę tworzę w funkcji, chyba w main (nieistotne) i przekazuję wskaźnik do niej funkcji1. Ale teraz w tej funkcji1 znowu wywołuję inną funkcję, funkcję2 i chcę jej przekazać ten wskaźnik - i tutaj kompilator wrzeszczy, że już nie używam gwiazdki. W sumie logiczne, ale proszę o upewnienie, że to jest dobrze:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #4 27 Lis 2014 16:33
    mcvsama
    Poziom 15  

    Brakuje określenia typów zwracanych przez funkcje (void?). W main próbujesz przekazać strukturę przez wartość. Użyj "&nowy", aby pobrać wskaźnik do nowy. I dodaj gwiazdkę w funkcja2() - musi działać, nie ma bata.

    0
  • Pomocny post
    #5 27 Lis 2014 17:11
    vonar
    Poziom 28  

    Właściwie nie wiadomo, jak to w końcu miało wyglądać, więc dam przykład w dwóch wersjach ;)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    mcvsama napisał:
    Mogę się mylić, ale od któregoś momentu chyba w C funkcje mogą zwracać struktury tak jak w C++ - przez wartość.

    Od ANSI C (C89). Nie mogły w oryginalnym K&R C.

    0