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

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1031 Aktiv.: 4.17 Kraj: Rače
|
Objavljeno: Ned Dec 11, 2011 1:47 pm Naslov sporočila: C prevajalnik (MPLAB C30), zanimivo seštevanje |
|
|
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 |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.15
|
Objavljeno: Ned Dec 11, 2011 2:35 pm Naslov sporočila: |
|
|
#define FREQ 0xA000+1100+(CH*100)
Je tako OK? _________________ LP, Matjaž |
|
| Nazaj na vrh |
|
 |
zdovcj Član


Pridružen-a: Sob 18 Jul 2009 13:26 Prispevkov: 118 Aktiv.: 0.58 Kraj: Kovor
|
Objavljeno: Ned Dec 11, 2011 3:11 pm Naslov sporočila: |
|
|
| 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 |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1031 Aktiv.: 4.17 Kraj: Rače
|
Objavljeno: Ned Dec 11, 2011 3:22 pm Naslov sporočila: |
|
|
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 |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Ned Dec 11, 2011 3:53 pm Naslov sporočila: |
|
|
#define CH 2UL
probaj tole... _________________ Tule nisem več aktiven. |
|
| Nazaj na vrh |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1031 Aktiv.: 4.17 Kraj: Rače
|
Objavljeno: Ned Dec 11, 2011 5:32 pm Naslov sporočila: |
|
|
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 |
|
 |
MitjaN Član

Pridružen-a: Sre 17 Avg 2011 15:40 Prispevkov: 91 Aktiv.: 0.51 Kraj: Ljubljana
|
Objavljeno: Ned Dec 11, 2011 7:40 pm Naslov sporočila: |
|
|
Ž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 |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1031 Aktiv.: 4.17 Kraj: Rače
|
Objavljeno: Ned Dec 11, 2011 8:38 pm Naslov sporočila: |
|
|
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 |
|
 |
MitjaN Član

Pridružen-a: Sre 17 Avg 2011 15:40 Prispevkov: 91 Aktiv.: 0.51 Kraj: Ljubljana
|
Objavljeno: Pon Dec 12, 2011 9:06 am Naslov sporočila: |
|
|
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 |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1031 Aktiv.: 4.17 Kraj: Rače
|
Objavljeno: Pon Dec 12, 2011 11:16 am Naslov sporočila: |
|
|
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 |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1031 Aktiv.: 4.17 Kraj: Rače
|
Objavljeno: Pon Dec 12, 2011 9:05 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|