2012-08-15 3 views
8

Próbowałem uruchomić plik C https://github.com/amree/mykad-c/blob/master/scdump.c, ale wciąż otrzymuję Invalid suffix "-252" on integer constant w tej części kodu:Nieprawidłowy sufiks „-252” na całkowitą stałą

 if (RxBuffer[0x11E-252] == 'P') 
      printf("Female\n"); 
     else if (RxBuffer[0x11E-252] == 'L') 
      printf("Male\n"); 
     else 
      printf("%c\n", RxBuffer[0x11E-252]); 

Jestem całkiem pewien, że to związane z składnią. Ale tak naprawdę nie rozumiem kodu (próbuję, ale prawie utknąłem). Czy ktoś może mi pomóc?

+0

Z jakiego kompilatora korzystasz? Jest to błąd kompilatora, który był obecny w gcc 2.95, może na początku gcc 3.x i być może innych kompilatorach. –

+0

@R. - ten błąd występuje dla mnie z całkiem niedawnym gcc 4.6.1 - jest błąd zamknięty jako "RESOLVED INVALID": http://gcc.gnu.org/bugzilla/show_bug.cgi?id=3885 Istnieje otwarty błąd śledzący uczynienie diagnostyki bardziej przyjaznym: http://gc.gnu.org/bugzilla/show_bug.cgi?id=24976 –

+0

@R ..: Używam Qt Framework, więc domyślam się, że używam kompilatora GCC? Ten sam błąd wystąpił w systemach Windows (MingW) i Linux (zmodyfikowany w celu użycia pcsc-lite) (gcc 4.5.2) – amree

Odpowiedz

5
0x11E-252 

jest szesnastkowym zmiennoprzecinkowy stałe w C -252 jest Wykładnik. Otrzymasz ostrzeżenie, ponieważ inicjalizujesz obiekt będący liczbą całkowitą ze stałą float.

0x11E - 252 // Note the whitespace 

jest wyrażeniem całkowitoliczbowym.

Użyj tych ostatnich, aby uzyskać pożądane zachowanie.

EDIT:

moja odpowiedź nie jest rzeczywiście prawdą. O ile poprawka jest w porządku, zobacz odpowiedź z @MichaelBurr, aby uzyskać prawdziwe wyjaśnienie tego, co się dzieje. 0x11E-252 jest odczytywany jako pojedynczy token w regułach C i nie jest prawidłową liczbą zmiennoprzecinkową (lub całkowitą).

+1

To nie jest ostrzeżenie, jest to błąd, ponieważ stałe FP hex używają 'p' zamiast' e' (ponieważ 'e' jest poprawną cyfrą heksadecymalną). Oto [link] (http://stackoverflow.com/a/4825867/335858) wyjaśnienie stałej zmiennoprzecinkowej w C99. – dasblinkenlight

+0

Cóż, miałem na myśli ostrzeżenie w sensie diagnostyki C. – ouah

+0

Ach, rozumiem. Przyjemna odpowiedź, nawiasem mówiąc (+1). – dasblinkenlight

10

Podczas gdy ten problem jest związany ze stałymi zmiennoprzecinkowymi stałymi, podstawowa przyczyna problemu nie leży w tym, że 0x11E jest początkiem stałej zmiennoprzecinkowej (ponieważ nie jest to początek stałej pływającej w kształcie szesnastkowym). Jest to jeden token zamiast trzech tokenów, takich jak 0x11F-252. Jeśli spojrzeć na C99 6.4.8 „przetw numery”, zobaczysz, że pp numer tokena jest: (.) ​​

Szereg przerób zaczyna się od cyfry ewentualnie poprzedzone okresem i może być stosowana przez poprawnych znaków identyfikacyjnych oraz znaków sekwencje e +, e-, E + E, P +, P-, P + lub P-

Więc 0x11E-252 jest jeden żeton i tokenizing występuje w fazie translacji 3, ale kiedy przychodzi czas na interpretację tokenu składniowo i semantycznie (co dzieje się w fazie tłumaczenia 7), nie jest to poprawne pod względem syntaktycznym, więc pojawia się błąd kompilatora.

Z drugiej strony, 0x11F-252 jest trzy żetony ponieważ - nie jest częścią numeru przerób tokena o ile nie zostanie natychmiast poprzedzony P lub E (górna lub małymi literami).

Oczywiście jest to związane ze stałymi zmiennoprzecinkowymi (szesnastkowymi lub innymi), dlatego znak - może znaleźć się w środku znacznika numeru preprocessingu. Należy jednak zauważyć, że otrzymają podobne komunikaty o błędach dla tokenów takich jak 0xx11F lub 22bad_token, które nie przypominają stałej stałej zmiennoprzecinkowej.

Poprawka ma postać as ouah noted, należy wstawić spację przed numerem -, aby zmusić kompilator do traktowania sekwencji jako więcej niż jeden token. Jeśli to był twój kod, lepszym rozwiązaniem może być podanie nazw wszystkich magicznych liczb (wyliczeń lub makr). Identyfikator, po którym następuje -, nie będzie traktowany jako pojedynczy token.Plus masz nadzieję, że zyskasz premię, dzięki której kod będzie trochę bardziej samoprzylepny.

+0

Zobacz pod koniec http://gcc.gnu.org/onlinedocs/gcc/Incompatibilities.html dla jawnej dokumentacji GCC na ten temat. –