Sida 2 av 2

Re: Fråga: #define i C, kombinera värden

Postat: 4 juli 2012, 23:15:46
av sodjan
Alla #defines handlar om stränghantering.
Vad strängen står för är helt irrelevant, det har
ju inte preprocessorn en aning om i alla fall...

Det *låter* som att du har missförstått vad #define gör.

Re: Fråga: #define i C, kombinera värden

Postat: 5 juli 2012, 04:07:41
av Icecap
Jag vill påstå att jag mycket väl vet vad #define gör men att alla förslag som har kommit in inte fungerar, helt enkelt för att deras slutresultat skapas av preprocessorn medan jag vill ha detta resultat behandlat av just preprocesorn.

Men jag ska testa lite under dagen...

Re: Fråga: #define i C, kombinera värden

Postat: 5 juli 2012, 10:49:37
av sodjan
OK. Jag fattar noll av vad du vill uppnå... :-)
Det behövs ett exempel på hur du skulle vilja skriva koden
och vad det i så fall skulle uppnå för effekt. Oavsett om
det nu faktiskt fungerar eller inte...

Se så kan man ju alltid skapa sin egen pre-pre-processor som
skapar t.ex include filer on-the-fly. Man kanske får ha sitt
eget build-script där man integrerad detta, men i alla fall...

Re: Fråga: #define i C, kombinera värden

Postat: 5 juli 2012, 15:36:42
av anders_w
Om du av någon anledning vill köra preprocessorn två gånger kan du lägga dina #define's i en .h-fil och inkludera denna två gånger. Men det är normat sätt inget att rekommendera och löser förmodligen inte dina problem.

Re: Fråga: #define i C, kombinera värden

Postat: 5 juli 2012, 15:53:00
av kimmen
Vad tror du om följande? Eller har jag missförstått vad det är du vill ha?

Kod: Markera allt

int TestPort;
int TestDdr;

#define PIN18_DATA   TestPort
#define PIN18_DDR   TestDdr

#define GLUE(x, y)  x##y
#define PINDDR(x) GLUE(x, _DDR)
#define PINDATA(x) GLUE(x, _DATA)

#define TEST   PIN18

void test()
{
   PINDATA(TEST) = 17;
   PINDDR(TEST) = 3;
}
Koden är testad i både GCC och MSVC, och borde fungera i även andra kompilatorer. :) Anledningen att jag inte gör x##_DDR direkt i PINDDR(x)-makrot är att parametern x då inte expanderas före den limmas ihop med _DDR. Ovanstående fungerar däremot korrekt eftersom parametern TEST till PINDDRförst binds till första parametern för GLUE, varefter den expanderas till PIN18och skickas vidare. GLUE limmar sedan ihop PIN18_DDR vilket expanderas till TestDdr i detta testfallet.

Re: Fråga: #define i C, kombinera värden

Postat: 5 juli 2012, 19:20:22
av Icecap
Sedär kimmen, det är ung. vad jag hade funderat på igår - och vad jag struntade i idag till förmån för en alldeles för lång kajaktur.

Skal kolla lite på det hela, återkommer med resultat.

Sodjan: mitt mål är att skapa "idiotsäkra" referenser från en enda referensangivelse.

Om jag t.ex. anger att ett visst namn ska förknippas med "Pin_18" vill jag sedan ha definitioner som inte behöver att skrivas in manuellt och därför ska "Pin_18" kopplas ihop med t.ex. pinnens riktningsregister och andra saker som kan vara intressanta.

Så skriver jag:
#define LED_Green Pin_18
vill jag att ytterligare #define's ska lägga till t.ex:
#define LED_Green_Dir Pin_18_D
och såklart per automatik, man ska alltså inte behöva skriva in dessa "extra" #define's själv, de ska ligga där från starten. På det vis kan man skapa en definitionsfil på en viss hårdvara som används till många olika saker och varje projekt kan använda den samma hårdvaradefinitionsfil utan att man behöver skriva mer än just (t.ex.) "Pin_18" som definition.

Och detta kan jag få till att fungera, bara synd att det först är klart när preprocessorn är klar varför det inte är möjligt att uppnå.

Re: Fråga: #define i C, kombinera värden

Postat: 16 juli 2012, 23:51:09
av Mr M
Jag brukar använda excell ibland för att skapa kod som jag sen kan klistra in i mitt program. Ofta för att skapa defines utifrån en lista på pin namn och signalnamn. Kanske ett alternativ?