Struktury w języku C.

Struktury w języku C.
TK
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad rok
  • Postów:15
0

Witam!

Chciałbym się zapytać w jaki sposób zapisać mogę coś do struktury w strukturze.

Załóżmy że mamy:

Kopiuj

Struct rodzina_t{
    int a;
    int b;
};

Struct znajomi_t{
      struct rodzina_t rodzina;
    ......
};

struct znajomi_t* czytaj(struct znajomi_t* p){
    
    int x=2;
    //jak przypisac za pomocą operatora strzałki (->) to x=2 do struktury rodzina, int a?
    . . . . .
}

Pozdrawiam

edytowany 1x, ostatnio: TheKryszczynPL
lion137
A cos jasniej?
SE
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 3 lata
  • Postów:318
1

//jak przypisac za pomocą operatora strzałki (->) to x=2 do struktury rodzina, int a?

rodzina_t->a = x;?
Czy masz coś innego na myśli?

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
0

Jakie x?


au7h
  • Rejestracja:ponad 11 lat
  • Ostatnio:około rok
  • Postów:215
2
Kopiuj
p->rodzina.a = x;
p->rodzina.b = x;

ale nie wiem w sumie czy o to chodziło :D

edytowany 1x, ostatnio: au7h
MO
  • Rejestracja:około 10 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Tam gdzie jest (centy)metro...
1

To jest typowy i częsty idiom dziedziczenia implementowany w C. Wystarcza rzutowanie na wskaźnik struktury rodzica aby dostać się do jego atrybutów bezpośrednio. Warunkiem koniecznym jest występowanie tegoż rodzica jako 1 składnika struktury dziecka. Tak się buduje "obiekty sterowników" np. w systemie GNU/Linux lub tworzy się inne wymaganie hierarchie.

Kopiuj
#include <stdio.h>
#include <stdlib.h>

struct rodzina_t{
    int a;
    int b;
};

struct znajomi_t{
    struct rodzina_t rodzina;
    int c;
};

struct znajomi_t* ustaw(struct znajomi_t* p) {
    struct rodzina_t * rodzinaPtr = (struct rodzina_t *)p;
    rodzinaPtr->a = 1;
    rodzinaPtr->b = 2;
    p->c = 3;
    return p;
}

void pokaz(struct znajomi_t const * p) {
    struct rodzina_t * rodzinaPtr = (struct rodzina_t *)p;
    printf("%d, %d, %d\n", rodzinaPtr->a, rodzinaPtr->b, p->c);
}

int main(void) {
    struct znajomi_t znajomi;
    ustaw(&znajomi);
    pokaz(&znajomi);
    return EXIT_SUCCESS;
}

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
Zobacz pozostały 1 komentarz
MO
Cóż... nie to że się upieram się że "to ładne" aczkolwiek że to się stosuje, jestem absolutnie pewien. Czy "edukacyjne", myślę że jak najbardziej warto o tym wiedzieć. W oryginalnych zastosowaniach (kernel) występuje jeszcze makro container_of ale to już mi się wydało zbyt skomplikowane by tu je rozwijać. Warunki działania także na wstępie jasno opisałem więc można wyciągnąć własny wniosek czy kod jest kruchy czy nie. Poza tym myślę że warto znać szersze spektrum użycia by wybrać co może być poprawne/użyteczne w danym kontekście.
AM
A napiszesz kiedy taki cast jest użyteczny? Bo w tym przypadku twój cast nie jest. (ja mam 2 pomysły na użycie tego casta, napisze je po tym jak ty napiszesz swoje, oba moje pomysły nie powinny byc podawane nikomu kto sie uczy bo tylko utrudniaja nauke)
MO
Przypadek bieżący (czyli "możliwość dziedziczenia"), implementacja tablicy vtable, przekazanie typu wariantowego gdzie rozmiar/struktura danego wariantu jest różny, przesłanie kontekstu (czyli symulacja domknięcia), unia z dyskryminatorem, w użytecznych kontekstach z FAM (Flexible Array Member) w C99.. pewnie jeszcze kilka by się znalazło... Pokazywać czy nie pokazywać.. Osobiście miałem doświadczenie że gdy pokazałem, podniosłem świadomość modelu pamięci i właściwości języka u osoby która się uczyła. Oczywiście połączone to było ze strict alliasing i zagrożeniami.
AM
Musisz te rzeczy napisać w angielskich nazwach bo nigdy nie słyszałem użytecznym kontekście w FAM czy symulacji domknięcia, a "discriminated unions" to wcale nie są unie z dyskryminatorem. Co do przypadku bieżącego to gdzie ty tutaj widzisz jakikolwiek związek z dziedziczeniem?<br /> Jeżeli uważasz że osoba która zaczyna naukę w C powinna być świadoma takich rzeczy jak strict aliasing, to ... jesteś w błędzie. :)
MO
Aha.. :-) To wiesz, może już nie pokazuj tych przykładów które miałeś na myśli... Jak dla mnie wystarczająco pokazałeś...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.