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, przekazywanie struktury lub jej danych do funkcji

drakston 20 Lis 2022 15:37 342 4
REKLAMA
  • #1 20294273
    drakston
    Poziom 18  
    Posty: 409
    Pomógł: 4
    Ocena: 7
    witam

    Trochę się zagubiłem i potrzebuję pomocy.

    Mam program na atmegę, złożony z kilku plików. Jeden plik ma funkcje i wszystkie zmienne plus struktury, dotyczące obsługi danych z pamięci zewnętrznej.

    W skrócie.
    plik DATA.h
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    w pliku DATA.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czyli tworzę 8 takich struktur presetów, funkcje napisane w DATA.c uzupełniają te struktury odpowiednimi danymi z pamięci i jest ok.

    To co chce to nie używać extern żeby jakoś nad tym zapanować. Stworzyłem funkcje które odczytują z wybranej struktury pojedyncze zmienne np presetMode lub zmieniam jej wartość i jest ok, np.

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


    Mam problem problem z napisaniem funkcji do tablic/char/ i samej całej struktury.
    jako że mam je statyczne dla danego pliku głownie jako zabezpieczenie żeby przypadkiem z innego pliku w niejasny sposób ingerować, nie mam jak przekazać całej struktury bo inne pliki projektu nie widzą deklaracji struktury preset.

    Jak to ogarnąć żeby w razie potrzeby mieć dostęp do tych struktur z innego pliku w celu edycji lub odczytu,.
    Bo może mi się zdarzyć funkcja która będzie bazowała na większości pól w strukturze. Do każdego pola robić osobną funkcje czy da się pracować na całej strukturze ?
    I co najważniejsze czy da się to zrobić żeby nie tracić dodatkowej pamięci.
  • REKLAMA
  • #2 20294817
    Dżyszla
    Poziom 42  
    Posty: 7077
    Pomógł: 1095
    Ocena: 226
    Ale czemu nie widzą deklaracji? Chcąc na niej operować, to tą deklarację trzeba im udostępnić. Wówczas wg nazwy możesz w parametrach przekazywać poszczególne elementy tablicy tej struktury bez udostępniania całej tablicy jako takiej. Jeśli jednak chciałbyś np. udostępnić w trybie tylko do odczytu jakiś element, to już bez obiektowości niewygodnie to realizować, bo wówczas faktycznie musiałbyś utworzyć pseudo-interfejs w postaci pliku z funkcjami.
  • REKLAMA
  • #3 20294874
    drakston
    Poziom 18  
    Posty: 409
    Pomógł: 4
    Ocena: 7
    Nie widzą bo nie ma w innych plikach extern a w pliku gdzie się znajdują jest static przy deklaracji.

    Generalnie ostatnio się dowiedziałem że używanie extern przy rozbudowanym projekcie w C jest błędem. Powinno się właśnie utworzyć prosty interfejs czyli funkcje robiące get i set dla konkretnych danych w strukturach, żeby nie było bałaganu jaki powstaje niby przy extern.

    Mam projekt który się składa z 15 plików w ktorych są różne funkcje i one bazują na wybranych danych znajdujących się w strukturach w jednym konkretnym pliku DATA.c.

    Na razie uprościłem sobie projekt grupując dane w większej ilości struktur, ale nie wiem czy jest sens pchać się w tworzenie tego "interfejsu" czy lecieć dalej na extern i pilnować co gdzie jest udostępniane do odczytu i edycji.
  • REKLAMA
  • #4 20294895
    mwilkowski1
    Poziom 10  
    Posty: 42
    Pomógł: 2
    Ocena: 9
    Hej,
    jest to świetna kwestia.

    Jest na to wzorzec projektowy, który stosuje się w dużych projektach informatycznych - dependency injection. Inaczej nigdy nie dałoby się w nich zapanować nad kodem, strukturami i bałaganem związanymi z pomieszaniem kodu i danych. Jest wspierany przez popularne frameworki. Polega on na tym, że wykorzystuje się framework informatyczny (np. Spring Framework w Javie) do budowania skomplikowanych struktur i zależności między nimi. Wtedy NIGDY nie posługujesz się zmiennymi globalnymi, a raczej zależnościami, które przechodzą pośrednio lub bezpośrednio przez jedną dużą strukturę (lub jej zależności).

    Niestety, nie znam ani jednego frameworku wspierającego dependency injection dla języka C, a dodatkowo w języku C jest to nieco mniej naturalne i nieco trudniejsze (chociaż do zrobienia) niż w C++ lub innym języku obiektowym.

    W dużym skrócie powinieneś aplikację projektować tak, że masz jakąś globalną strukturę, np. App, w której masz podstawowe struktury, a następnie struktury zależne od tych struktur i inicjalizujesz te zależności na starcie aplikacji. Później WSZYSTKIE funkcje, które realizują jakąś funkcjonalność biznesową otrzymuję te struktury zależne jako parametry wejściowe.

    Trudno to wytłumaczyć bez przykładów, a nie ma takowych dla języka C, ale jeśli posługujesz się innymi językami programowania (C++, .NET, Java) to wpisz w przeglądarkę Dependency Injection i znajdziesz mnóstwo przykładów.
  • #5 20295147
    _jta_
    Specjalista elektronik
    Posty: 49161
    Pomógł: 3212
    Ocena: 4262
    Struktury wspólne dla wielu plików źródłowych definiuje się w pliku .h i włącza przez #include "plik.h"

    A przekazywać można wskaźniki do struktur. Albo zdefiniować zbiór funkcji do operacji na nich.
REKLAMA