define mit abhängigkeit

Gast #1303428
Lesenswert?
• ▲
▼
wie kann ich soetwas machen?

#define A y=4
#define B y=5

#define ERSETZE(x) ? ?


ERSETZE(0);//diese zeile wird im c code geschrieben
A;
y=4;   //soll letztendlich ausgeführt werden

ERSETZE(1);//diese zeile wird im c code geschrieben
B;
y=5;   //soll letztendlich ausgeführt werden

ich möchte in abhängigkeit des parameters x ein bestimmtes define 
"anwählen" ist dies möglich?

Gruß,
markus
#1303437
Lesenswert?
• ▲
▼
Ich denke du suchst gerade nach einer möglichst eleganten "Wie schiesse 
ich mir selber ins Knie" Lösung.

Sprich: Ich glaube du gehst dein Problem falsch an.
Was ist dein eigentliches Problem?

(Deine Problemlösung scheitert daran, dass der Präprozessor keine 
anderen unausgewerteten Präprozessoranweisungen eintauschen kann.
Es gibt zwar
#ifdef
#if
aber das hilft dir in dem Fall nicht viel.

Eventuell könnte man mit einer Kombination aus #define #undef #include 
und #if was erreichen (spukt nur so als Gedanke bei mir im Kopf rum).
Gast #1303452
Lesenswert?
• ▲
▼
#define ON            |=
#define OFF           &=~
#define P3            3

#define PORTB_P3_ON   PORTB ON (1<<P3)
#define PORTB_P3_OFF  PORTB OFF(1<<P3)

#define PORTB_P3(x)   ????

PORTB_P3(0);
PORTB_P3(1);

ich wollte die lösungen mit bitfeldern/unions usw. umgehen. Ich denke 
diese shift methode ist immer noch die (schnellste) auch wenn ich noch 
nicht nachgesehen habe was bei einer lösung mit einem bitfeld 
letztendlich aus dem code wird....

PORTB.7=0; //als beispiel

letztendlich kommt es mir darauf an, möglichst flexibel vieles zuvor 
einstellbar zu machen, und dennoch keinen assembler auswuchs mehr 
deswegen zu erzeugen...

gruß,
markus
Gast #1303512
Lesenswert?
• ▲
▼
dann könnte ich also schreiben:

#define ON            |=
#define OFF           &=~
#define P3            3

#define PORTB_P3_ON   PORTB ON (1<<P3)
#define PORTB_P3_OFF  PORTB OFF(1<<P3)

#define PORTB_P3(x)   x==0 ? PORTB_P3_OFF : PORTB_P3_ON

PORTB_P3(0);   //PB PIN 3 aus
PORTB_P3(1);   //PB PIN 3 an

ist das jetzt alles blödsinnig, oder ergibt es einen sinn.

gruß,
markus
#1303520
Lesenswert?
• ▲
▼
markus jung schrieb:

> ich wollte die lösungen mit bitfeldern/unions usw. umgehen. Ich denke
> diese shift methode ist immer noch die (schnellste) auch wenn ich noch
> nicht nachgesehen habe was bei einer lösung mit einem bitfeld
> letztendlich aus dem code wird....

Da wird genau das gleiche draus:
sbi/cbi
#1303561
Lesenswert?
• ▲
▼
markus jung schrieb:
> dann könnte ich also schreiben:
>
> #define ON            |=
> #define OFF           &=~
> #define P3            3
>
> #define PORTB_P3_ON   PORTB ON (1<<P3)
> #define PORTB_P3_OFF  PORTB OFF(1<<P3)
>
> #define PORTB_P3(x)   x==0 ? PORTB_P3_OFF : PORTB_P3_ON
>
> PORTB_P3(0);   //PB PIN 3 aus
> PORTB_P3(1);   //PB PIN 3 an

Ja. Aber der Laufzeitvergleich von x bleibt nach wie vor drinn. Es sei 
denn der Optimizer wirft ihn raus (was er könnte und wahrscheinlich auch 
tun wird)

Dein eigentliches Ziel, dass

  PORTB_P3(0)

zu

  PORTB &= ( 1 << 3 );

expandiert, hast du so noch nicht erreicht. Allerdings stehen die 
Chancen gut, dass im Endeffekt nach ein paar Optimizerdurchgängen genau 
das herauskommt.
Gast #1303655
Lesenswert?
• ▲
▼
@benedikt

das hoffe ich dann immer nur, danke für die bestätigung.

@KHB
...hast du so noch nicht erreicht

1)warum nicht?Das habe ich noch nicht ganz verstanden

2)kann x eigentlich auch eine variable sein!?

also ich will das natürlich nicht, aber gesetz dem fall es wäre eine...

es soll übrigens natürlich

PORTB &=~ ( 1 << 3 ); daraus werden.

gruß,
markus
#1303679
Lesenswert?
• ▲
▼
markus jung schrieb:
>
> 1)warum nicht?Das habe ich noch nicht ganz verstanden

Nachdem der Präprozessor seinen Teil erledigt hat, bleibt
1
    ...
2
    0==0 ? PORTB &=~ (1 << 3) : PORTB |= (1<<3);
3
    ...

übrig.
Es obliegt jetzt dem Optimizer zu erkennen, dass 0==0 immer wahr ist und 
der ganze Ausdruck daher zu
1
     PORTB &=~ (1 << 3);

vereinfacht werden kann. Eventuell wird er auch eine Warnung schmeissen: 
"Comparison always true" oder so ähnlich.

> 2)kann x eigentlich auch eine variable sein!?

in dem Fall ja.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.