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 

C prevajalnik (MPLAB C30), zanimivo seštevanje

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1031
Aktiv.: 4.17
Kraj: Rače

PrispevekObjavljeno: Ned Dec 11, 2011 1:47 pm    Naslov sporočila:  C prevajalnik (MPLAB C30), zanimivo seštevanje Odgovori s citatom

Eno vprašanje za poznavalce C-ja, oziroma MPLAB C30.

Zakaj to:

Koda:
#define CH 2
#define FREQ 0xA000+1100+CH*100

ni enako temu:

Koda:
#define FREQ 0xA000+1100+200


Moje izkušnje s C-jem sicer niso bogate, sam pa že kar nekaj naredil in kaj takšnega še nisem zasledil.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
matjazkariz
Član
Član



Pridružen-a: Sre 03 Nov 2004 18:09
Prispevkov: 1026
Aktiv.: 4.15

PrispevekObjavljeno: Ned Dec 11, 2011 2:35 pm    Naslov sporočila:   Odgovori s citatom

#define FREQ 0xA000+1100+(CH*100)

Je tako OK?

_________________
LP, Matjaž
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
zdovcj
Član
Član



Pridružen-a: Sob 18 Jul 2009 13:26
Prispevkov: 118
Aktiv.: 0.58
Kraj: Kovor

PrispevekObjavljeno: Ned Dec 11, 2011 3:11 pm    Naslov sporočila:   Odgovori s citatom

Oklepaji ne bi smeli delati problemov. Množenje ima vedno prednost. Kakšne vrednosti pa dobiš v prvem oz. drugem primeru? Pri katerem računu je napaka?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1031
Aktiv.: 4.17
Kraj: Rače

PrispevekObjavljeno: Ned Dec 11, 2011 3:22 pm    Naslov sporočila:   Odgovori s citatom

Ne.

Pomaga samo to:

Koda:
#define CH (unsigned int)2
#define FREQ 0xA000+1100+CH*100


No, saj sem hitro ugotovil kje je problem, samo me je vseeno presenetilo. Tukaj pač ni govora o spremenljivkah ampak o preprocesorju, ki bi lahko zadevo preprosto seštel v tak tip, kot je prva konstanta.

Pa tega sploh ne bi opazil, če ne bi HI-TECH-ov prevajanik, ki ga uporabljam pri oddajniku, enako kodo seštel pravilno in se zato frekvenca ni več ujemala.

Je to splošno pravilo pri C-ju, ali je to preprosto bug v C30?


Nazadnje urejal/a igor_k Ned Dec 11, 2011 5:22 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gumby
Član
Član



Pridružen-a: Sob 28 Apr 2007 12:32
Prispevkov: 4066
Aktiv.: 17.60

PrispevekObjavljeno: Ned Dec 11, 2011 3:53 pm    Naslov sporočila:   Odgovori s citatom

#define CH 2UL

probaj tole...

_________________
Tule nisem več aktiven.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1031
Aktiv.: 4.17
Kraj: Rače

PrispevekObjavljeno: Ned Dec 11, 2011 5:32 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
#define CH 2UL


Ja, tudi to dela, samo še vedno ne vidim logike v tem, da 2*100 ni 200, če smo na nivoju preprocesorja, kjer se ne operira s spremenljivkami. Namreč, tudi to:

Koda:
#define FREQ 0xA000+1100+2*100


ne da pravega rezultata.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MitjaN
Član
Član



Pridružen-a: Sre 17 Avg 2011 15:40
Prispevkov: 91
Aktiv.: 0.51
Kraj: Ljubljana

PrispevekObjavljeno: Ned Dec 11, 2011 7:40 pm    Naslov sporočila:   Odgovori s citatom

Živijo,

razlika je v tem kako se celoten izraz ovrednoti.

Če ni posebej navedeno potem prevajalnik za celoštevilske konstante smatra da so tipa "int". Tako da v primeru ko "CH" ni posebej definiran kot "unsigned int" (z "2UL" oziroma z "(unsigned int)2"), se celoten izraz ovrednoti drugače. Priporočam da si malo prebereš na temo "integer type promotions".

Tako da 2*100 = 200, vendar je razlika med "(int)2 * (int)100" in "(unsigned int)2 * (int)100".

Jaz se zaradi tega močno izogibam uporabe nepredznačenih števil, saj je na daljši rok vzdrževanje programov nekoliko lažje. Še dodatno pa pomaga če vse pretvorbe tipov napišeš explicitno (tako ko se "splača" vrstni red ovrednotenja daljših izrazov označiti z oklepaji).

LP, Mitja
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1031
Aktiv.: 4.17
Kraj: Rače

PrispevekObjavljeno: Ned Dec 11, 2011 8:38 pm    Naslov sporočila:   Odgovori s citatom

No, če govorimo o int, potem je 2*100 vedno 200.
Očitno pa je, da jemlje konstante kot tip char in zato rezultat ni takšen, kot bi človek pričakoval.
Smešno je to, da compiler za 16bitne PIC-e jemlje konstante kot char, Hi-TECH-ov za 8bitne pa kot int.
Kakorkoli, vsekakor to nima nobenega smisla, zato ker tu ne govorimo o klasičnih konstantah ampak o preprocesorju, ki bo konstanto izračunal v času prevajanja, zato bi bilo smiselno, da tip določi šele po izračunu, oz. da so vse konstante takšen tip, kot je prva konstanta.

Bom pisal na Microchip in jih malo povprašal.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MitjaN
Član
Član



Pridružen-a: Sre 17 Avg 2011 15:40
Prispevkov: 91
Aktiv.: 0.51
Kraj: Ljubljana

PrispevekObjavljeno: Pon Dec 12, 2011 9:06 am    Naslov sporočila:   Odgovori s citatom

Sam standard C-ja nikjer ne določa kako velik mora bit "int", "long" ali "char". To je prepuščeno implementaciji prevajalnika. In če (ne vem) PIC18 prevajalnik smatra da je "int" velik 8 bitov, potem so stvari lahko zanimive.

Kar se pa tiče preprocesorja, je po mojem mnenju dobra implementacija (kaj naj bi bila pravilna raje ne bi razpravljal) tista, ki se obnaša tako kot sam prevajalnik. Poleg tega v danem primeru preprocesor samo in samo zamenja tekst. Še vedno je prevajalnik tisti ki ga ovrednoti.

LP, Mitja
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1031
Aktiv.: 4.17
Kraj: Rače

PrispevekObjavljeno: Pon Dec 12, 2011 11:16 am    Naslov sporočila:   Odgovori s citatom

V HI-TECH-ovem PIC18 je int seveda 16 bitov, hotel sem povedati, da očitno uporablja konstante tipa int, ker tam je pravilno izračunal.

Meni je jasno, da preprocesor samo zamenja tekst, samo kakšna logika je to, da mi prevajalnik 2*100 pretvori v -72? Saj vendar govorimo o 16 bitnih procesorjih.

Edit: pravzaprav v -56, ker je 0xFF=-1, če je tip signed char.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1031
Aktiv.: 4.17
Kraj: Rače

PrispevekObjavljeno: Pon Dec 12, 2011 9:05 pm    Naslov sporočila:   Odgovori s citatom

Zabluzil sem. Tak je to, če delaš s šestimi različnimi procesorji in tremi prevajalniki. Potem pa pozabiš, da je ta problem nastal v MPLAB C18 in ne v C30, kar potem obnašanje prevajalnika naredi nekako logično, če pa klikneš še na "enable integer promotions" (kot mi je že namigoval MitjaN), potem pa konstante postanejo int in problema ni več.

Hvala vsem za odgovore.
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 -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
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: 232 dni


Powered by phpBB © 2001, 2005 phpBB Group