/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
kantede parantheser i makroer
Fra : Troels Thomsen


Dato : 22-03-04 08:43


Hvordan er det lige at kantede parantheser i makroer fungerer?

Jeg fandt flg i en header til en Keil 8051 compiler
#define XBYTE ((unsigned char volatile xdata *) 0)
Den skal bruges således (hvis man vil læse en byte fra adresse 0x8000):
char value = XBYTE [0x8000]
("xdata" er vist et segment / beskyttet ord, det farves blåt af ide'et)

Argumentet erstatter åbenbart nullet?
Altså noget i denne stil:

#define myXBYTE(addr) ((unsigned char volatile xdata *) addr)
char myValue = XBYTE(0x8000)

mvh Troels



 
 
Byrial Jensen (22-03-2004)
Kommentar
Fra : Byrial Jensen


Dato : 22-03-04 16:07

Troels Thomsen wrote:
> Hvordan er det lige at kantede parantheser i makroer fungerer?

Kantede parenteser bruges ikke i forbindelse med makroer.

> Jeg fandt flg i en header til en Keil 8051 compiler
> #define XBYTE ((unsigned char volatile xdata *) 0)

Det er tallet 0 konverteret (casted) til en pointer.

> Den skal bruges således (hvis man vil læse en byte fra adresse 0x8000):
> char value = XBYTE [0x8000]
> ("xdata" er vist et segment / beskyttet ord, det farves blåt af ide'et)
>
> Argumentet erstatter åbenbart nullet?

[0x8000] er ikke et argument til makroen. Makroen ekspanderer til en
pointer, og [0x8000] er en indeksering af pointeren.

> Altså noget i denne stil:
>
> #define myXBYTE(addr) ((unsigned char volatile xdata *) addr)
> char myValue = XBYTE(0x8000)

Nej. Hvis du vil bruge adressen som makro-argument ser det sådan her ud:

// Indeksér en 0-pointer med addr
#define MY_XBYTE(addr) (((unsigned char volatile xdata *) 0)[addr])
unsigned char myValue = MY_XBYTE(0x8000);

Eller eventuelt sådan her:

// Konvertér addr til pointer og dereferér
#define MY_XBYTE2(addr) (*((unsigned char volatile xdata *)(addr)))
unsigned char myValue2 = MY_XBYTE2(0x8000);


Frederik Hertzum (22-03-2004)
Kommentar
Fra : Frederik Hertzum


Dato : 22-03-04 20:04

Byrial Jensen wrote:

> Troels Thomsen wrote:
>> Hvordan er det lige at kantede parantheser i makroer fungerer?
>
> Kantede parenteser bruges ikke i forbindelse med makroer.

Makroer bliver ekpanderet til programkode (c), før programmet bliver
compilet og linket, af preprocessorern, og bliver derfor brugt i makroer
nøjagtig som enhver anden stump c-kode.

Troels Thomsen (25-03-2004)
Kommentar
Fra : Troels Thomsen


Dato : 25-03-04 10:02


Ok, de kantede er bare en slags array indexsering


> #define myXBYTE(addr) ((unsigned char volatile xdata *) addr)

>> // Konvertér addr til pointer og dereferér
>> #define MY_XBYTE2(addr) (*((unsigned char volatile xdata *)(addr)))
>> unsigned char myValue2 = MY_XBYTE2(0x8000);
>>
(ja det var vist dette jeg prøvede på)

mvh tpt



Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408183
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste