 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Pon Mar 29, 2010 7:51 pm Naslov sporočila: Razlika pri postavitvi oklepajev |
|
|
Zakaj spodnja dva primera naredita različno kodo? Eden deluje prav, drugi čisto narobe... (Procesor: LPC23xx serija)
Prav:
Koda: |
(unsigned int)(0x0F << 6);
|
Narobe:
Koda: |
(unsigned int)0x0F << 6;
|
_________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
Pyr0Beast Član

Pridružen-a: Pon 16 Jun 2008 14:11 Prispevkov: 4969 Aktiv.: 23.98
|
Objavljeno: Pon Mar 29, 2010 8:20 pm Naslov sporočila: |
|
|
Hmm, kakor pomnim smo mi delali takole s šarmom;
Koda: |
unsigned int (0x0F << 6); |
|
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Pon Mar 29, 2010 9:32 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.61 Kraj: Ljubljana
|
Objavljeno: Pon Mar 29, 2010 9:52 pm Naslov sporočila: |
|
|
ARM-ov v4.0.0 prevajalnik obe različici prevede enako in pravilno.
NeoTO, kateri prevajalnik si uporabil? A lahko pripneš disassemblirano kodo? _________________ Question is more important than the answer.(Plato) |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Pon Mar 29, 2010 10:48 pm Naslov sporočila: |
|
|
Citiram: |
(unsigned int)(0x0F << 6); |
Najprej naredi premik 0x0F << 6, potem naredi konverzijo.
Citiram: |
(unsigned int)0x0F << 6; |
najprej konvertira 0x0f in potem celo stvar premakne. Kako različno kodo pa naredi? Saj unsigned int je 32 bitov če se ne motim, tako da bi morala biti rezultata dokaj enaka. Razen če gre čisto za sintaktično in compilerjevo stvar.
Citiram: |
Hmm, kakor pomnim smo mi delali takole s šarmom; |
Ne gre za isto stvar! Ti z unsigned int deklariraš tip spremenljivke, z (unsigned int) pa prisilno konvertiraš v določen tip.
Kroko, v tvojem primeru gre dejansko za napačno uporabo operatorjev (prednosti), v prvem primeru pa ni neke vidne napake. _________________
Pravilo št. 1: Pišite slovensko, velja za vse.
TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no! |
|
Nazaj na vrh |
|
 |
. Neznanec

Pridružen-a: Pet 01 Okt 2004 1:17 Prispevkov: 1 Aktiv.: 0.00
|
Objavljeno: Pon Mar 29, 2010 11:31 pm Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Mar 30, 2010 12:57 am Naslov sporočila: |
|
|
Kroko je napisal/a: |
tale je tudi nevarna
Koda: |
//napačno
if (var & 0xF0 == 0xF0)...
//pravilno
if ((var & 0xF0) == 0xF0)...
|
|
Če se ne motim, ima == prednost pred & in prevedena koda je v prvem primeru izgledala pravzaprav takole:
Koda: |
if (var & (0xF0 == 0xF0))
|
Tudi C ni več to, kar naj bi bil. Nekateri prevajalniki se strašno pritožujejo nad takimi izrazi, tj. nekaj v stilu: "Comparison is always true due to limited range of data type". Odvisno pač od tipa spremenljivke var oz. tipa tistega true v oklepaju.
Take težave lahko nastopijo predvsem pri primerjavi signed/unsigned izrazov s konstantami definiranimi z #define
alessio, prevajalnik res naredi prav? Kajti, če je == res v prednosti, potem prevajalnik ne sme predvidevati, da sem naredil napako.
Saj veš, premature optimization is root of all evil. Ampak nisem 100%, lahko se motim (je pozna ura hhh) _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Tor Mar 30, 2010 7:09 am Naslov sporočila: |
|
|
alessio je napisal/a: |
ARM-ov v4.0.0 prevajalnik obe različici prevede enako in pravilno.
NeoTO, kateri prevajalnik si uporabil? A lahko pripneš disassemblirano kodo? |
Uporabil sem Keilov prevajalnik (zdajle ne morem pogledat katera verzija je, ampak ni ravno zastarela).
Kode nisem disassemblal, ker ko sem dodal oklepaje, je LCD (v 'driverju' za LCD sem namreč imel to vrstico) začel spet delovati... _________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
bostjang Član

Pridružen-a: Tor 03 Jan 2006 15:29 Prispevkov: 3469 Aktiv.: 14.64 Kraj: Postojna
|
Objavljeno: Tor Mar 30, 2010 8:24 am Naslov sporočila: |
|
|
Pravkar sem stestiral s Keil-om RV armcc V3.1.0.934 in se oboje prevede v pravilno 0x3C0. Tako naj bi tudi bilo, saj je int privzeti tip in navedena vrednost gre vanj brez izgubljenih bitov.
Je levo od te kode samo prireditev ali še kakšna operacija? |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Mar 30, 2010 8:31 am Naslov sporočila: |
|
|
Preveril tudi sam. Pravilno je po vaši logiki. C ima pretcedenčno listo in ekvivalenca je pred bitwise-AND. Keil torej sam "doda" oklepaje, kar je IMHO zelo zelo narobe. Razen, če gre za čudno izjemo, ker so v primeru konstante.
Sedaj pa še en test: if (a & b == c) _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Tor Mar 30, 2010 8:42 am Naslov sporočila: |
|
|
Glitch je napisal/a: |
C ima pretcedenčno listo in ekvivalenca je pred bitwise-AND. Keil torej sam "doda" oklepaje, kar je IMHO zelo zelo narobe. |
Glitch, zakaj je narobe, če kompiler upošteva prioriteto operatorjev? |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Mar 30, 2010 8:48 am Naslov sporočila: |
|
|
Ker je v vseh tabelah prioritet za C == eno stopnjo nad bitwise &.
OK, vseh pa res nisem mogel preveriti. Vsaj tistih nekaj prvih zadetkov na google in na wikiju. _________________ Answers: $1, Short: $5, Correct: $25, dumb looks are still free. |
|
Nazaj na vrh |
|
 |
NeoTO Član


Pridružen-a: Pon 28 Mar 2005 19:19 Prispevkov: 2752 Aktiv.: 11.61 Kraj: Trzic
|
Objavljeno: Tor Mar 30, 2010 8:48 am Naslov sporočila: |
|
|
bostjang je napisal/a: |
Pravkar sem stestiral s Keil-om RV armcc V3.1.0.934 in se oboje prevede v pravilno 0x3C0. Tako naj bi tudi bilo, saj je int privzeti tip in navedena vrednost gre vanj brez izgubljenih bitov.
Je levo od te kode samo prireditev ali še kakšna operacija? |
Tole je uporabljeno v #define stavku in sem pozabil na to, da se dobesedno naredi copy-paste operacija. Na mestu uporabe pa je en bitni OR operator, ki je pokvaril zabavo... _________________ Lp,
Matevž |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Tor Mar 30, 2010 8:53 am Naslov sporočila: |
|
|
Glitch, Alessiov post je bil namenjen NeoTojevemu vprašanju:
Citiram: |
Zakaj spodnja dva primera naredita različno kodo? Eden deluje prav, drugi čisto narobe... (Procesor: LPC23xx serija)
Prav:
Koda:
(unsigned int)(0x0F << 6);
Narobe:
Koda:
(unsigned int)0x0F << 6;
|
Ti si pa preučeval krokojev primer:
Citiram: |
tale je tudi nevarna
Koda:
//napačno
if (var & 0xF0 == 0xF0)...
//pravilno
if ((var & 0xF0) == 0xF0)... |
 _________________
Pravilo št. 1: Pišite slovensko, velja za vse.
TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no! |
|
Nazaj na vrh |
|
 |
Umnik Član

Pridružen-a: Čet 16 Sep 2004 17:52 Prispevkov: 958 Aktiv.: 4.04 Kraj: Novo mesto
|
Objavljeno: Tor Mar 30, 2010 8:55 am Naslov sporočila: |
|
|
Glitch je napisal/a: |
Ker je v vseh tabelah prioritet za C == eno stopnjo nad bitwise &. |
Seveda, jasno.
Kar mi ni jasno je, če se pogovarjamo o istih primerih Namreč, ti si vzel Krokotov primer in citiraš alessia, ki je komentiral NeoTOjev primer
Ali pa so moji možgani na dopustu, pa ne dohajam vsega skupaj... |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 499 dni
Powered by phpBB © 2001, 2005 phpBB Group
|