www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Razlika pri postavitvi oklepajev
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.61
Kraj: Trzic

PrispevekObjavljeno: Pon Mar 29, 2010 7:51 pm    Naslov sporočila:  Razlika pri postavitvi oklepajev Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Pyr0Beast
Član
Član



Pridružen-a: Pon 16 Jun 2008 14:11
Prispevkov: 4969
Aktiv.: 23.98

PrispevekObjavljeno: Pon Mar 29, 2010 8:20 pm    Naslov sporočila:   Odgovori s citatom

Hmm, kakor pomnim smo mi delali takole s šarmom;

Koda:
unsigned int (0x0F << 6);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Pon Mar 29, 2010 9:32 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
alessio
Član
Član



Pridružen-a: Pon 04 Dec 2006 8:39
Prispevkov: 363
Aktiv.: 1.61
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 29, 2010 9:52 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Pon Mar 29, 2010 10:48 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Exclamation Pravilo št. 1: Pišite slovensko, velja za vse.

TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no!
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Pon Mar 29, 2010 11:31 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Mar 30, 2010 12:57 am    Naslov sporočila:   Odgovori s citatom

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. Smile Ampak nisem 100%, lahko se motim (je pozna ura hhh)

_________________
Answers: $1, Short: $5, Correct: $25, dumb looks are still free.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.61
Kraj: Trzic

PrispevekObjavljeno: Tor Mar 30, 2010 7:09 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
bostjang
Član
Član



Pridružen-a: Tor 03 Jan 2006 15:29
Prispevkov: 3469
Aktiv.: 14.64
Kraj: Postojna

PrispevekObjavljeno: Tor Mar 30, 2010 8:24 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Mar 30, 2010 8:31 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Tor Mar 30, 2010 8:42 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Mar 30, 2010 8:48 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.61
Kraj: Trzic

PrispevekObjavljeno: Tor Mar 30, 2010 8:48 am    Naslov sporočila:   Odgovori s citatom

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?


Brick wall

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Tor Mar 30, 2010 8:53 am    Naslov sporočila:   Odgovori s citatom

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)...


Wink

_________________
Exclamation Pravilo št. 1: Pišite slovensko, velja za vse.

TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no!
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Umnik
Član
Član



Pridružen-a: Čet 16 Sep 2004 17:52
Prispevkov: 958
Aktiv.: 4.04
Kraj: Novo mesto

PrispevekObjavljeno: Tor Mar 30, 2010 8:55 am    Naslov sporočila:   Odgovori s citatom

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 Smile Namreč, ti si vzel Krokotov primer in citiraš alessia, ki je komentiral NeoTOjev primer Smile

Ali pa so moji možgani na dopustu, pa ne dohajam vsega skupaj...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
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