KEIL+kompilator C == bledy ?

Jan 29, 2004 17 Replies

Witam Wszystkich, podczas pisania programu w C na '51 w Keil-u znalazlem taka mala dziwnostke:



unsigned long wynik; wynik=20000+50000; (po kompilacji wynik=0x011170 czyli poprawnie)



natomiast:



unsigned long wynik; wynik=7*10000; (po kompilacji wynik=0x01170 czyli nie poprawnie)



I mam do Was takie pytanko, czy moglby to ktos sprawdzic ? Moze to akurat ja mam cos nie tak ustawione ? Z gory Dzieki.



Pozdrowka Robert


Robert Łopatecki napisal(a):

To jest Ok. Zrob tak:

wynik=(unsigned long)7*10000;

lub

wynik=7*(unsigned long)10000;

sprawdz to: unsigned long wynik; wynik=7ul*10000ul;

Czy moglibyscie mi wyjasnic dlaczego tak zapisywac ? Czy moze doszliscie do tego droga prob i bledow ?

Robert

Robert Łopatecki napisal(a):

Metoda prob i bledow nie. Raczej czachologicznie. Chodzi o to, ze

10000 jest to liczba typu int. 7 to char. Kompilator wykonujac obliczenie zaklada, ze wynik bedzie typu int. Czyli tu jest zrodlo bledu, poniewaz wynik powinien byc long. I na koncu kompilator dokonuje konwersje int -> long. Konwersja typow to jedna z wazniejszych spraw gdy piszesz na mikrokontrolery.

Wielkie dzieki.

Cenna uwaga, ale chyba nie tylko w przypadku mikrokotrolerow.

Robert

Robert Łopatecki napisal(a):

Znacznie wazniejsze niz w przypadku duzych maszyn, bo tam niektore bledy nie wyleza.

Dlatego istnieje w C cos, co nazywamy rzutowaniem typów :-).

Ostro¿ny bym by³ z twierdzeniem, i¿ Keil robi b³±d :-)

Pozdrawiam Mister

Zgadza sie. Szczegolnie w przypadku 32 bit RISC. Dobrze manewrujac typami i rzutowaniem mozna wiele uzyskac.

B.

Porsze pamietac! Jezeli ktos posiada pirackie kopie programów nie wolno ich uzywac. Nalezy sporzadzic liste wszystkich osób powiazanych i wraz z programami bezwzglednie przekazac, jako material dowodowy policji:)

----------------------------------------------------------------------------

---------------------------------------------------------- Sprawdzalem to i jest dobrze. Sciagnij demo najnowszej wersji i sprawdz. Która wersje masz? swiniaczek

Tam tez znalazlem blad.

Uzytkownik "Robert £opatecki" snipped-for-privacy@poczta.onet.pl> napisal w wiadomosci news:bvamp0$get$ snipped-for-privacy@news.onet.pl...

I dlatego bardzo mnie dziwi popularnosc tego jezyka w tych zastosowaniach, a nie czegos, co zacznie wrzeszczec gdy tylko programiscie wpadnie do glowy cos glupiego. IMO Ada bylaby znacznie lepsza.

Pozdrawiam Piotr Wyderski

"Behold, I tell you a Mystery". ;-) Jezyk C ma paskudna umiejetnosc i sklonnosc dokonywania m.in. niejawnych promocji calkowitych i zmiennoprzecinkowych oraz konwersji calkowitych, zmiennoprzecinkowych i arytmetycznych, a takze konwersji typu wskaznikow. W C++ jest jeszcze "smieszniej"... Stad czasem bez wczytania sie w standad wlasciwie nie wiadomo co oznacza dane wyrazenie. Ty rowniez stales sie kolejna ofiara tego mechanizmu. Chodzi o to, ze formalnie rzecz biorac liczby ze znakiem i bez znaku tworza osobne klasy obiektow i nie powinny byc ze soba mieszane bez jawnego zyczenia konwersji ze strony programisty. Niestety C(++) ma na ten temat wlasne zdanie i bez Twojej swiadomej woli radosnie konwertuje sobie te liczby, czego efektem sa bardzo trudne do wykrycia bledy. W tym przypadku kompilator obliczyl sobie 7*10000 jako int (mod 2^16) i nastepnie zamienil wynik na unsigned long, bo kazales mu pomnozyc inty. Napisz _jawnie_, ze chcesz mnozyc unsigned longi: 7UL*10000UL i powinno dzialac. Nie przejmuj sie niepowodzeniami, C i C++ to jezyki-koszmarki, ktore maja tylko te zalete, ze bardzo dobrze tlumacza sie na kod maszynowy. Jedyne co mozesz zrobic, to albo sie przyzwyczaic do takich atrakcji, albo zaczac pisac w czyms porzadniejszym.

Pozdrawiam Piotr Wyderski

Bo robi, a scislej pod grozba utraty zgodnosci ze standardem powiela. Zas prawdziwi winowajcy tego stanu rzeczy nazywaja sie Kernighan, Ritchie oraz Stroustrup.

Pozdrawiam Piotr Wyderski

W artykule <bvdrfl$lhc$ snipped-for-privacy@atlantis.news.tpi.pl> Piotr Wyderski napisal(a):

Wolę Małgorzatę ;-)))

bp, nmsp

Marcin Stanisz

Od Ady odeszlismy 15 lat temu, mimo ze byla lepsza :-)

J.

Piotr Wyderski wrote: [ciach]

A w czym piszesz Piotrze ? I co ? (tak z ciekawosci pytam, bo ja jednak w C/C++)

Obecnie zajmuje sie automatyczna translacja; pisze generator asemblerow. A w czym ogolnie pisze? -- to zalezy od konkretnego problemu, spektrum jest szerokie: od asemblera do Prologu, z dwoma bardzo silnymi pikami w okolicach C++ oraz Javy. :-)

Coz, ja bym sie _bardzo_ bal pisac w C++ na mikrokontrolery. Zbyt duzo od nich zazwyczaj zalezy, a pisanie oprogramowania o znaczeniu krytycznym dla ludzkiego zycia i zdrowia w C++ to gra w rosyjska ruletke. No ale ja mam bardzo paranoiczne podejscie do niezawodnosci oprogramowania... ;-)

Pozdrawiam Piotr Wyderski

Piotr Wyderski wrote:

Nie, pisanie w C++ na mikrokontrolery :)) niee... nie mialem mikrokontrolerow na mysli.. Na mysli mialem programowanie "zwyczajne" . Pozatym, nadużywanie obiektów moim zdaniem jest częste (i nagminne niestety), ze szkodą dla rozmiaru, szybkosci i niezawodności własnie.

Dziekuje :)

Pozdrawiam

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required