Macro, C - men hur?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Macro, C - men hur?

Inlägg av Icecap »

Språk: C

Idag är jag seg i skallen. Jag har en struktur som används vid serieportskommunikation, inget konstigt med det. Nu håller jag på att skriva stommen till ett projekt med fler serieportar och då deras rutiner är snudd på identiska vore det trevligt om jag kunde göra en typedef som gör detta för mig.

En typedef är ju hur enkel som helst MEN jag skulle gärna vilja ha möjlighet att ge olika bufferstorlekar för de olika enheter och nu börjar det bli ett problem för mig. Som exempel:

Kod: Markera allt

#define TX_SIZE 100
#define RX_SIZE  50
typedef struct
  {
  char Buffer_Tx[TX_SIZE];
  char Buffer_Rx[RX_SIZE];
  } T_SERIAL_PORT;

T_SERIAL_PORT Ser_1;
T_SERIAL_PORT Ser_2;
Då har jag två minnesblock som innehåller samma variabler men heter Ser_1 hhv. Ser_2.

Jag skulle dock vilja ha det så att jag kunde skriva något i stil med:
T_SERIAL_PORT [TX_SIZE] [RX_SIZE] Ser_1;
T_SERIAL_PORT [TX_SIZE] [RX_SIZE] Ser_2;
för att på det vis kunde anpassa dom till behovet och enkelt ändra dom. I vilken följd parameterna skrivs är utan betydelse, parenteser och liknande likaså, det viktiga är att det fungerar.

Och det har inte bara med denna funktion att göra, ibland behöver jag att kunde ha en "stomme" i form av t.ex. en typedef som jag sedan kan använda med lämplig parameter till för att få rätt storlek/värde/whatever. Men just nu går jag sur i det hela så om någon har lekt med detta kan du/ni väl sparka mig i rätt riktning.
Senast redigerad av Icecap 25 juli 2013, 16:25:20, redigerad totalt 1 gång.
SvenW
Inlägg: 1122
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: MAcro, C - men hur?

Inlägg av SvenW »

Man kan nog göra så här: (obs ingen typedef)

Kod: Markera allt

#define T_SERIAL_PORT(TX_SIZE, RX_SIZE) struct	\
  {						\
    char Buffer_Tx[TX_SIZE];			\
    char Buffer_Rx[RX_SIZE];			\
  }

T_SERIAL_PORT (256, 128) ts1;
T_SERIAL_PORT (512, 512) ts2;
men många gånger gör den typen av makron koden mer svårläst och bör kanske undvikas.
Backslash '\' är radförlängare i Unix. Vet inte om det gäller i MS-Windows-världen.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Macro, C - men hur?

Inlägg av blueint »

Kod: Markera allt

#define T_SERIAL_PORT(tx,rx,name) typedef struct { char Buffer_Tx[tx]; char Buffer_Rx[rx]; } (name);

T_SERIAL_PORT(100, 50, Ser_1);
T_SERIAL_PORT(100, 50, Ser_2);
Lite extra klamrar och paranteser kan ev behövas.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Macro, C - men hur?

Inlägg av Icecap »

blueint: testade din approach - och den fungerar direkt. Nu har jag 5 rader + makrot på 14 rader istället för 5 * 14 rader.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Macro, C - men hur?

Inlägg av blueint »

Tog det direkt från huvudet utan att testa ;)
Skriv svar