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

[ATmega32][C] - Zwracanie przez funkcję wskaźnika

A.T. 02 Lis 2012 23:26 1509 6
REKLAMA
  • #1 11481786
    A.T.
    Poziom 20  
    Witam
    szukałem w Internecie ale nic nie znalazłem. Czy ten kod jest poprawnie napisany? Czy zwracanie wartości poprzez wskaźnik jest nieeleganckie?
    Funkcja jest wymyślona, żeby zobrazować problem.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pozdrawiam A.T.
  • REKLAMA
  • Pomocny post
    #2 11481930
    Raphaw
    Poziom 20  
    Wygląda poprawnie. Co do samej idei ma swoje plusy i minusy. Jest niezastąpiona jeśli funkcja zwraca więcej niż jeden wynik, jest pomocna w przypadku operacji na dużych danych (unikamy tworzenia lokalnej kopii obiektu w funkcji). Minus - trzeba uważać, tak pisany kod może być trudniejszy w analizie. Więcej znaleźć można w "Symfonii c++".
    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #3 11481932
    mirekk36
    Poziom 42  
    Przecież w tej funkcji nie zwracasz wartości przez wskaźnik .... zwracasz typ double. A to nie wskaźnik....

    Pewnie chodzi ci o to czy modyfikacja struktury przekazanej przez wskaźnik jako argument funkcji jest poprawna ? - pewnie że poprawna. Ale to tylko modyfikacja argumentu (obojętnie czy typu wskaźnikowego czy nie) .....
  • REKLAMA
  • #4 11481954
    A.T.
    Poziom 20  
    Dziękuję za szybkie odpowiedzi:)
    Jeśli byście mogli spojrzeć jeszcze na ten fragment kodu. Czy nie ma w nim rażących błędów. Będę bardzo wdzięczny. Dopiero się przełamuję aby używać wskaźników i nie wiem czy robię to w poprawny sposób.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I plik nagłówkowy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #5 11481962
    mirekk36
    Poziom 42  
    No masz błąd - bo np w pliku nagłówkowym *.h DEFINIUJESZ zmienną strukturalną :( a tak się nie robi, w nagłówkowych powinny być SAME DEKLARACJE a nie definicje (no może poza funkcjami inline - ale to inna sprawa)

    Zrób sobie tak w *.h

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


    ale w pliku *.c musisz wtedy dać definicję

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


    i będzie OK ;)

    Dodano po 1 [minuty]:

    zresztą jeśli to jest prosty projekt i tylko te dwa pliki to nawet w *.h nie musisz dawać DEKLARACJI

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 11482243
    tmf
    VIP Zasłużony dla elektroda
    Jeszcze jedno - zauważ, że nie ma sensu aby funkcja zwracała element struktury przekazywany przez wskaźnik. Dlaczego? Dlatego, że ta struktura już zawiera zwracany element. Np. twoja struktura TKALMAN zawiera pole angle, po co więc je zwracać? To tylko generuje dodatkowy kod. Te funkcje zwracające elementy struktury to pewna kalka z C++, gdzie tego typu konstrukcje wykorzystuje się do udostępnienia wartości zmiennej prywatnej obiektu. Czasami ma to zastosowanie w c, ale nie ma sensu tego nadużywać, tym bardziej, że w pokazanym kodzie i tak odwołujesz się bezpośrednio do pól. A jeśli już to używaj modyfikatora const dla wskaźników będących argumentami, których wartości nie modyfikujesz, a jedynie zwracasz. Zwykle umożliwia to agresywniejszą optymalizację i jest dodatkowym zabezpieczeniem przed błędami.
    Druga sprawa - zwykle wielkimi literami piszę się nazwy makr. Dla typów można np. użyć suffiksu _t, np. Kalman_t, dla struktur nic się nie używa, bo masz słowo kluczowe struct, które określa o co chodzi. Warto też wykorzystać typedef, żeby nie pisać ciągle struct TKALMAN.
  • #7 11486837
    A.T.
    Poziom 20  
    Dziękuję za odpowiedź.
    Jednak nie bardzo rozumiem o co chodzi z const. Znaczy się nie rozumiem gdzie mógłbym go u siebie zastosować. Mógłbyś podać jedno z miejsc gdzie go wpisać?

    Dodano po 19 [minuty]:

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


    Czy o takie zmiany chodziło?
    I mam jeszcze pytanie, może w ogóle ta metoda ze strukturą jest kiepska. Może idzie to wykonać innym sposobem bardziej poprawnie i elegancko?
    Dziękuję.
REKLAMA