Vill skapa definitioner med ## men får inte till det

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Vill skapa definitioner med ## men får inte till det

Inlägg av Icecap »

Jag har ett projekt till en PIC (MPLAB X & XC8) där jag behöver några definitioner.

En är vilken portpinne, en annan är vilket TRIS-register som det gäller.

Så jag skriver alltså (för en av pinnarna):
#define D_JK0_SET_P B // Port
#define D_JK0_SET_B 5 // Bit
vilket betyder att den är på PORTB5.

Så jag BORDE kunde göra:
#define JK0_Set PORT ## D_JK0_SET_P ## bits.R ## D_JK0_SET_P ## D_JK0_SET_B
// Har tänkt: "PORT" + "B" + "bits.R" + "B" + "5" = "PORTBbits.RB5"
#define JK0_Set TRIS ## D_JK0_SET_P ## D_JK0_SET_B
vilket jag ser som givande:
#define JK0_Set PORTBbits.RB5
#define JK0_Set_D TRISB5

Men nix, får en del intressanta felmeddelanden. Jag har letat på nätet, hittat en del om preprocessorn till GCC och andra men helt klart måste det vara något jag inte fattar. Jag har testat med citationstecken, utan och lite olika kombinationer men jag har helt klart missat något grundläggande.

Jag vill alltså stycka ihop ett antal definitioner automagisk baserat på portnamn och bit, då kan jag skriva definitionerna och sedan välja att byta placering utan problem.

Men hur gör jag?

Helst vill jag ha ett lösningexempel med förklaring, då kan jag lära mig något - och det är ju förutsättningen för en bra dag.
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Vill skapa definitioner med ## men får inte till det

Inlägg av ahlsten »

Testa din fil med -E som flagga till gcc, så får du se vad preprocessorn gör. Jag tycker det ser ut som att den bara kommer concata exempelvis

Kod: Markera allt

#define JK0_Set PORT ## D_JK0_SET_P ## bits.R ## D_JK0_SET_P ## D_JK0_SET_B
till

Kod: Markera allt

#define JK0_Set PORTD_JK0_SET_Pbits.RD_JK0_SET_PD_JK0_SET_B


Du behöver nog göra en macrofunktion av det...

Edit: Mitt exempel är lite halvvägs av vad preprocessorn spottar ur sig, men du förstår säkert. JK0_Set byts ut mot PORTD_JK0_SET_Pbits.RD_JK0_SET_PD_JK0_SET_B...

Kod: Markera allt

// eller ja, du behöver köra två macrofunktioner för att först expandera exempelvis D_JK0_SET_P innan ihopslagningen.
#define portbit2(PORTNAME, BITPOS) (PORT ## PORTNAME ## bits.R ## PORTNAME ## BITPOS)
#define portbit(P, B) portbit2(P, B)

#define D_JK0_SET_P B // Port
#define D_JK0_SET_B 5 // Bit

#define JK0_Set portbit(D_JK0_SET_P, D_JK0_SET_B)

JK0_Set

int main(int argc, const char* argv[]){
    return 0;
}
vilket efter preprocessorn ger (jag har ju inga definitioner av PORTBbits.RB5 här, så där stannar den):

Kod: Markera allt

(PORTBbits.RB5)
int main(int argc, const char* argv[]){
    return 0;
}
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Vill skapa definitioner med ## men får inte till det

Inlägg av Icecap »

Lysande Sickan!!! Ska testa snarast.

EDIT: Vist fan fungerar det! TACK!!!

Mer EDIT: Nu är alla pin-definitioner flyttade och ett par macro'n definierat. Det fungerar perfekt.
Projektet det är för är nämligen lite flytande. Jag kan funktionerna men vilka pinnar som skulle vara vad var av typen: "de 4 utgångspinnar nära nederst vänster kvadrant av kretsen, de 4 par Set/Reset i övre del av kretsen och utgångarna nära nederst höger kvadrant".

Detta är inget problem som sådan men det blir ju ganska lätt att man flyttar och kastar om lite och då brukar definitionerna man måste skriva manuellt på något tidpunkt att prutta sig och det blir konstiga fel.
Skriv svar