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

sscanf()... typ pierwszego parametru.. rzutowanie na const [avr-gcc]

Dr. Kuj 23 Mar 2011 21:09 2365 10
  • #1 9314436
    Dr. Kuj
    Poziom 13  
    Mam pytanie odnośnie warninga który wyrzuca mi kompilator...
    Dla takiego kodu wyrzuca:

    sscanf(liczba,"%d",&przerwanie);
    


    Warning : passing argument 1 of 'sscanf' from incompatible pointer type

    W opisie tej funkcji jest:

    Cytat:
    int sscanf ( const char * str, const char * format, ...);


    Problem udało mi się rozwiązać przez rzutowanie na:

    (char *)

    oraz

    (const char *)

    Które rzutowanie jest bardziej prawidłowe? Rzutowanie na typ const jest dla mnie trochę bez sensu...
  • #2 9314626
    hotdog
    Poziom 26  
    z Twojego pkt. widzenia nie ma to znaczenia. Ogólnie nie ma chyba takiego przypadku że trzeba rzutować na const. Const jest tylko dla preprocesora - takie zabezpieczenie przed przypadkową, jawną, modyfikacją zmiennej.
  • #3 9315174
    Dr. Kuj
    Poziom 13  
    A czy ktoś wie jak sie to powinno robić zgodnie ze sztuką?

    Będe też wdzięczny za jakiś link do podręcznika/dobrą książke na temat rzutowania w C (w języku C++ zasady są inne a opisów do niego nie brakuje...)
  • #4 9315641
    Konto nie istnieje
    Konto nie istnieje  
  • #5 9315864
    hotdog
    Poziom 26  
    albertb napisał:

    A czy rzutowanie na const jest bez sensu?
    Ogólnie nie, bo umożliwia kompilatorowi optymalizację kodu.


    Nie twierdze że tak nie jest w przypadku optymalizacji, ale możesz pokazać przykład kiedy słówko const, przy rzutowaniu, powoduje jakieś pozytywne zmiany w kodzie wynikowym?
  • #6 9315995
    tmf
    VIP Zasłużony dla elektroda
    Bez optymalizacji oczywiście nie powoduje. Daje tylko większą kontrolę nad poprawnością kodu. W przypadku włączenia optymalizacji zalety są oczywiste - np. przed wywołaniem funkcji kompilator nie musi tworzyć kopii argumentów przekazywanych jako const.
  • #7 9316142
    hotdog
    Poziom 26  
    No ok, ale przecież to we funkcji w liście parametrów jest zadeklarowana jako const. Więc i tak to wie, bez rzutowania?
  • #8 9316216
    Dr. Kuj
    Poziom 13  
    W podręcznikach które mam rzutowanie opisane jest bardzo pobierznie.. Napewno nie ma nic o rzutowaniu na const.
    Const zabezpiecza przed zmianą przekazywanej zmiennejv i modyfikacją wewnątrz funkcji.
    Skoro więc zmienna

    char * x

    musi być przyjęta jako

    const char * x

    to rzutowanie powinno odbyć się niejawnie

    funkcja (const char * y)

    funkcja(x)

    a mimo to kompilator (co ciekawe tylko w AVRstudio bo w WinAVR już nie) wymaga żeby wywołanie wyglądało tak:

    funkcja ( (const char *) x );

    Dlaczego trzeba to rzutować?
  • #9 9316324
    Konto nie istnieje
    Konto nie istnieje  
  • #10 9316330
    tmf
    VIP Zasłużony dla elektroda
    hotdog: miałem na myśli ogólny przypadek użycia const. W tym przypadku rzutowanie nic nie daje i co więcej jest niepotrzebne. Zmienną na typ const kompilator rzutuje automatycznie i nie powinno to generować ostrzeżeń. Co innego w drugą stronę - rzutowanie zmiennej const na zwykłą - tu pojawić się powinien błąd.
    Dr. Kuj - sądząc z innych twoich postów używasz IDE i kompilatora w wersjach BETA. Nie specjalnie ma więc sens zastanawiać się co się dzieje, o ile nie jesteś developerem gcc. Zacznij używać narzędzi produkcyjnych i nie zawracaj gitary :)
  • #11 9321081
    Dr. Kuj
    Poziom 13  
    W sumie może i racja. Wracam do AS4 :)
REKLAMA