Skocz do zawartości

"Arduino w akcji" pierwszy projekt


htfhere

Pomocna odpowiedź

main.c:132:7: warning: operation on 'x' may be undefined

Faktycznie skompilowane za pomoca gcc na PC daje w wyniku 1. Nie zmienia to faktu, ze program jest niepoprawny, a wynik bedzie zalezal od kompilatora i optymalizatora.

W sieci jest troche informacji o podobnych problemach np. tutaj:

http://stackoverflow.com/questions/4968854/is-i-i-truly-a-undefined-behavior

http://stackoverflow.com/questions/6716189/i-i-doesnt-increment-i-why

http://www.coderanch.com/t/408774/java/java/explain

[ Dodano: 30-04-2015, 17:46 ]

Jeszcze jako ciakawostka:

int main()
{
   int x = 0;
   int state = 0;

   state = x = state++;
   cout << "wartosc zmiennej to: " << state << endl;
   cout << "wartosc zmiennej to: " << x << endl;

   return 0;
}

Tutaj dopiero widac, ze kompilator nie zawsze generuje poprawne programy.

Kompilujac g++ (Debian 4.4.5-8) 4.4.5

state = 1, a x = 0 !

Link do komentarza
Share on other sites

http://gcc.godbolt.org/

int main() {
 int state = 1;
 state = state++;
 return state;
}

Z optymalizacją daje po prostu

return 1;

Bez optymalizacji widzimy co się dzieje:

mov    DWORD PTR [rbp-4], 1   ;state = 1
mov    eax, DWORD PTR [rbp-4] ;tmpA = state
lea    edx, [rax+1]           ;tmpB = tmpA+1
mov    DWORD PTR [rbp-4], edx ;state = tmpB -> Słowa Elvisa "Czyli nawet jesli state ulegnie zmianie to na krotko."
mov    DWORD PTR [rbp-4], eax ;state = tmpA
mov    eax, DWORD PTR [rbp-4] ;tmpA = state; return tmpA

A tak generalnie to język C/C++ ma właśnie zestaw tak zwanych "operacji niezdefiniowanych", których wynik zależy od użytego kompilatora, a programista formalnie nie ma jak przewidzieć wyniku i takich operacji nie należy używać w normalnym programowaniu. To właśnie przykład takiej operacji.

  • Lubię! 2
Link do komentarza
Share on other sites

Daje piwo za linka: http://gcc.godbolt.org/ - super narzedzie, ja wczoraj kompilowalem na wszystkim co mialem pod reka, a mozna to zrobic latwiej online.

Prosba do adminow - moze warto wydzielic fragment dyskucji z tematu dla poczatkujacych?

Podsumowujac:

state = state++;

Jest niepoprawne w C/C++, wartosc jest nieokreslona, zalezy od wersji kompilatora, a nawet od ustawien kompilacji (poziomu optymalizacji kodu). Nie nalezy takich konstrukcji uzywac. Zamiast tego nalezy napisac:

state++;

lub

state = state + 1;
Link do komentarza
Share on other sites

Prosba do adminow - moze warto wydzielic fragment dyskucji z tematu dla poczatkujacych?

To by trzeba było chyba cały temat wydzielić 🙂 Niech będzie jak jest, zobaczymy co będzie dalej.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Marooned, Elvis

Czyli wszystko się wyjaśniło 🙂 dziękuję za zainteresowanie tematem no i chyba trzeba skrobnąć maila do wydawcy "Arduino w akcji"...

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.