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
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).
:
Wiederhergestellt durch User
#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
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
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
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.
@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
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.