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

AS7, debugowanie i "Left of dot operand is an undefined composit"

figa_miga 10 Kwi 2017 09:58 1104 11
  • #1 16403934
    figa_miga
    Poziom 19  
    Na AS6 działa, natomiast na AS7 zamiast wartości zmiennej (struktura) widać tytułowe info.
    Kompiluje się bez błędów, google nic na ten temat nie zwracają...
    Jakaś idea?
  • #2 16403984
    JacekCz
    Poziom 42  
    1. Nie rozumiem, kompiluje się ... tzn z czego jest ten komunikat? Zbyt krótko to piszesz. Z podglądu debuggera? Debugerom często przeszkadza wysoki poziom optymalizacji

    2. Źródła choćby tej struktury, debugowanego fragmentu.
    Obrazek?
    Komunikat o błędzie podaj również w tekście posta, w temacie to mało intuicyjne.
  • #3 16403986
    Konto nie istnieje
    Konto nie istnieje  
  • #4 16404007
    figa_miga
    Poziom 19  
    No i rozwiązaliście, znalazłem byka przy pisaniu odpowiedzi na Wasze pytania. Wypada więc napisać po kolei.

    Struktura siedzi w pliku globals.h (dla przykłądu wklejam ją okrojoną do dwóch zmiennych):

    
    typedef struct  Par
    {
    	uint16_t	PosAct;			//aktualna pozycja z enkodera
    	uint16_t	PosActBuf;		//bufor posredniczacy w odczytuwaniu pozycji
    
    }Par;
    
    typedef struct OS
    {
    	Par OsX;
    	Par OsY;
    	Par OsZ;
    }OSd;
    
    extern OSd OS;
    


    W okienku debugera coś takiego
    AS7, debugowanie i "Left of dot operand is an undefined composit"


    Błąd faktycznie był tutaj
    typedef struct OS
    {
    	Par OsX;
    	Par OsY;
    	Par OsZ;
    }OSd;
    
    extern OSd OS;


    typedef struct OS powinno być OSd. Ale ciekawe że AS6 nie miał problemu, chyba że mi się po drodzę do innego kompa coś wymazało...
  • #5 16404022
    JacekCz
    Poziom 42  
    Wprowadzanie typów przed typedef w moim odczuciu zawsze było ... problemowe. Nie radziły sobie kompilatory, nie radzili sobie ludzie. W najstarszym C nie było nazywania struktur obrazowo mówiąc "w duchu C++" i typedef był jedyną możliwością.
    Odkąd jest "w stylu C++" czyli w realnych kompilatorach od > 1988?, w standardzie ... też od dawna, wydaje mi się że nie użyłem słowa typedef we własnym kodzie.
    Moim zdaniem należy odchodzić od typedef a już na pewno w przypadku struktur.

    Za AS7 stoi GCC we wreszcie współczesnej wersji i być może w twoim przypadku dawniej taki delikatny błąd programisty był tolerowany, obecnie nie.
  • #6 16404054
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16404112
    JacekCz
    Poziom 42  
    Piotrus_999 napisał:
    JacekCz napisał:
    Moim zdaniem należy odchodzić od typedef a już na pewno w przypadku struktur.
    A niby czemuż to? Rezygnować bo się nie umie?


    Choćby argument teoretyczny: panorama języków programowania jak się rozejrzeć w czasie - się generalnie wycofała z koncepcji aliasowania typu. ten 'koncept' się nie sprawdził. Po 30 latach od wynalezienia to widać, i widać w skali, tak myślę. nie mojej indywidualnej, ale społeczności.

    Odkrycie kol @figa_miga dokładnie jest zbieżne z moim sposobem myślenia: ktoś sobie umyślił tolerowanie błędu podczas aliasowania, bo wiele było zastanego kodu, który go zawierał.


    W innych wątkach dzielnie sam zwalczasz 'relikty C' jak przerost #define (żaden nowy język nie powtórzył tego w takim zakresie), lekkomyślne podejście do długości bufora w API itd...

    Ja sobie mam taki sposób patrzenia :) "Wie viele Sprachen du sprichst, sooft mal bist du Mensch." (J.W. Goethe) teraz przełóż to na języki programowania.

    Piotrus_999 napisał:

    Pośrednio użyłeś je tysiącami w plikach .H

    Rozumiem że size_t, uintX_t też nie używasz?


    Zauważyłeś więc pewnie zmniejszoną rolę w nowych projektach. Masz rację, ma to swoje miejsce i nie zniknie ...

    EDIT: "zwłaszcza w przypadku struktur"
  • #8 16404127
    Konto nie istnieje
    Konto nie istnieje  
  • #9 16404318
    grko
    Poziom 33  
    Piotrus_999 napisał:
    JacekCz napisał:
    się generalnie wycofała z koncepcji aliasowania typu.


    typedef != alias


    Wikipedia:
    "typedef is a reserved keyword in the C and C++ programming languages. It is used to create an alias name for another data type"

    https://en.wikipedia.org/wiki/Typedef

    Widać, że jeszcze masz problemy z C. Proponuję się poduczyć aby nie wypisywać tego typu "teorii" na forum.
  • #10 16404342
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16405006
    grko
    Poziom 33  
    @Piotrus_999 To wypadałoby się wypowiadać wyraźnie bo typedef w najpopularniejszych językach C oraz C++ oznacza alias czy Ci się to podoba czy nie. @JacekCz ma rację, że odchodzi sie od typedef (patrz Java) i ogólnie aliasowania. Nie jest to również dobrą praktyką w C. Zwłaszcza w odniesieniu do struktur oraz wskaźników o czym już było pisane kilka razy na tym forum. Powoływanie się na język D jest totalnie oderwane od rzeczywistości bo ani to język popularny ani specjalnie nadający się do embedded (ze względu na swoją bibliotekę standardową).
  • #12 16405025
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA