logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C++] Jak zwrócić strukturę z funkcji w C++?

Kubbaz 10 Cze 2011 10:40 8141 13
REKLAMA
  • #1 9595991
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Witam wszystkich Elektrodowiczów!

    Jak zrobić, aby funkcja zwracała strukturę? Mam taką sytuację:

    plik funkcje.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    plik main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9596217
    #
    Poziom 13  
    Posty: 119
    Pomógł: 2
    Ocena: 3
    Aby funkcja zwracała dane jakiegokolwiek typu sama musi być tego samego. Tj. jeżeli ma zwracać int'a musi być typu int (int nazwa (parametry)). W Twoim wypadku funkcja powinna być typu twojej struktury (nazwa_Twojej_struktury nazwa_funkcji (parametry)).
  • #3 9596232
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Teoretycznie w C/C++ nie ma problemu i struktura może być zwracana normalnie przez wartość:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Jednakże, jeżeli struktura jest duża, to nie jest to zbyt efektywne, bo cała struktura będzie kopiowana. Lepiej przekazać do funkcji wskaźnik na strukturę, a funkcja wypełni odpowiednie pola korzystając ze wskaźnika.
  • REKLAMA
  • REKLAMA
  • #5 9596410
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    A jesteś pewien, że używasz C++ a nie C? Piszesz cały czas o C++, więc użyłem składni C++. W C nie można pominąć słowa kluczowego struct przy odwołaniu do typu struktury. Mimo, że bardzo podobne, C++ i C to różne języki. :D
  • #7 9596790
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    :roll:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 9605790
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    Ok, teraz rozumiem ;). Mam tylko pytanie jak w funkcji int main () przekzazć wartość tej funkcji (która jest strukturą) do drugiej struktury, o takiej samej ilości pół i ich typie zmiennych (a nawet nazwach). Z tego co wiem, to nie można tak po prostu kopiować jednej struktury do drugiej (podobnie chyba jak tablic) -> Struktura = Struktura () (gdzie: Struktura, to poprostu zwykła struktura z polami, a Struktura () to fukncja zwracająca strukturę). Kompilator wyświetla mi błąd:
    ../src/main.c: In function 'main':
    ../src/main.c:57: error: incompatible types in assignment
    make: *** [src/main.o] Error 1
  • #10 9606161
    loganek2
    Poziom 17  
    Posty: 103
    Pomógł: 29
    Ocena: 4
    chodzi o coś takiego? :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #11 9606257
    winuser2
    Poziom 17  
    Posty: 377
    Pomógł: 19
    Ocena: 14
    Dlaczego chcesz zwracać strukturę przez funkcję ? To bardzo nie optymalne, ponieważ trzeba kopiować tyle bajtów, ile wynosi rozmiar struktury. Lepszym rozwiązaniem będzie zwrócenie wskaźnika albo przesłanie go jako argument, wtedy kopiowane jest tylko tyle bajtów, ile wynosi rozmiar wskaźnika na danej platformie.
  • #12 9606904
    Kubbaz
    Poziom 26  
    Posty: 1237
    Pomógł: 9
    Ocena: 30
    winuser2 napisał:
    Lepszym rozwiązaniem będzie zwrócenie wskaźnika albo przesłanie go jako argument...

    No właśnie, o takie coś mi chodzi.

    Obecnie mam taką sytuację, że w pliku data.c mam:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W pliku main.c w funkcji głównej mam:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ale ta linijka: DATA *CANMessage1 = &CANMessage; nie działa...
    Jak odwołać się do tamtej struktury zwracanej przez funkcję?
  • Pomocny post
    #13 9607030
    loganek2
    Poziom 17  
    Posty: 103
    Pomógł: 29
    Ocena: 4
    a co to jest? : i tak przy okazji, w C/C++ ma znaczenie, czy użyjemy wielkich, czy małych liter. chodzi o fragment:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    a powinno być:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #14 9607074
    winuser2
    Poziom 17  
    Posty: 377
    Pomógł: 19
    Ocena: 14
    Mozesz to zrobic na kilka sposobow.

    1. Zwrocenie wskaznika

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    2. Operowanie na wskazniku

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zaletą drugiego rozwiazania jest to, że nie ma tam alokacji / zwalniania pamięci, a więc mamy spokój od wycieków pamięci. Prawdopodobnie będzie to też szybsze.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat zwracania struktur z funkcji w języku C++. Użytkownik zapytał, jak poprawnie zrealizować tę operację. Odpowiedzi wskazują, że funkcja musi być zadeklarowana z typem zwracanym odpowiadającym strukturze. W przypadku dużych struktur, sugeruje się użycie wskaźników, aby uniknąć nieefektywnego kopiowania danych. Użytkownicy podali przykłady kodu w C i C++, a także omówili różnice w składni między tymi językami. Wskazano również na możliwość użycia `typedef` dla uproszczenia deklaracji struktur. Problemy z kompilacją związane z używaniem niewłaściwej składni oraz błędami typów były również omawiane.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA