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
Didn't find your answer? Ask the community — no account required.
M
Marcin E. Hamerla
Robert Łopatecki napisal(a):
To jest Ok. Zrob tak:
wynik=(unsigned long)7*10000;
lub
wynik=7*(unsigned long)10000;
P
peters
sprawdz to: unsigned long wynik; wynik=7ul*10000ul;
R
Robert Łopatecki
Czy moglibyscie mi wyjasnic dlaczego tak zapisywac ? Czy moze doszliscie do tego droga prob i bledow ?
Robert
M
Marcin E. Hamerla
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.
R
Robert Łopatecki
Wielkie dzieki.
Cenna uwaga, ale chyba nie tylko w przypadku mikrokotrolerow.
Robert
M
Marcin E. Hamerla
Robert Łopatecki napisal(a):
Znacznie wazniejsze niz w przypadku duzych maszyn, bo tam niektore bledy nie wyleza.
M
Mister
Dlatego istnieje w C cos, co nazywamy rzutowaniem typów :-).
Ostro¿ny bym by³ z twierdzeniem, i¿ Keil robi b³±d :-)
Pozdrawiam Mister
B
B
Zgadza sie. Szczegolnie w przypadku 32 bit RISC. Dobrze manewrujac typami i rzutowaniem mozna wiele uzyskac.
B.
S
swiniaczek
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...
P
Piotr Wyderski
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
P
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
P
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
M
Marcin Stanisz
W artykule <bvdrfl$lhc$ snipped-for-privacy@atlantis.news.tpi.pl> Piotr Wyderski napisal(a):
Wolę Małgorzatę ;-)))
bp, nmsp
Marcin Stanisz
J
J.F.
Od Ady odeszlismy 15 lat temu, mimo ze byla lepsza :-)
J.
F
fred cassidy
Piotr Wyderski wrote: [ciach]
A w czym piszesz Piotrze ? I co ? (tak z ciekawosci pytam, bo ja jednak w C/C++)
P
Piotr Wyderski
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
F
fred cassidy
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
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.