Hallo liebe Makro-Freunde und Freundinne,
folgendes Problem:
ich möchte folgende Anweisungen in ein Makro packen:
1) x += 1;
2) x = x % y;
Jetzt kommt noch die Abfrage:
3) if (x == 0) { ... }
ist es möglich das ALLES in EIN Makro zu packen??
Ich habe jetzt mal sowas probiert:
#define MACRO(X,Y) X+=1;X=X%Y;
aber ne Abfrage ist hier nicht mehr möglich?!
Jemand eine Idee ??
Danke!!
Du kannst in das Makro so ziemlich alles packen, was du lustig bist,
also auch if-Konstrukte, Funktionen, Datenstrukturen oder auch nur
Fragmente davon. Ich sehe gerade dein Problem nicht ganz.
Da der Präprozessor nur Text ersetzt, musst du allerdings darauf achten,
dass die Ersetzung im Kontext des Makroaufrufs zu einem sinnvollen
Ergebnis führt. Besonders zu beachten ist hier die richtige Klammerung
und die Verwendung von Semikola.
Volker wrote:
> #define MACRO(X,Y) do { X++; X%=Y; if (X == 0) {...} } while(0)
danke für die Antworten.
Ich habe mich wahrscheinlich nicht klar genug ausgedrückt.
Was ich eigentlich will ist eine Art MACRO Schedule Hilfe.
x += 1; -> zählt den Counter hoch, das ganze wird im 1 ms Takt
aufgerufen
x = x % y; -> y ist die Task-Zeit z.b. 3 - alle 3 ms
und dieser Task() soll dann aufgerufen werden, wenn x == 0 ist!
ich könnte natürlich sowas schreiben:
#define MACRO(X,Y) X+=1;X=X%Y;
aber dann geht ja sowas nicht:
1
if(MACRO(X,10)==0){// Syntax Error
2
Task();
3
}
wenn ich das IF ins makro packe, dann ist ja der Task Aufruf aussen vor!
Ich hoffe mein Problem ist jetzt etwas deutlich geworden. :)
Danke
Nubsi wrote:
> 1.) Nenn es nicht MACRO, gibt ihm einen aussagekräftigen Namen.
das mit MACRO war jetzt nur ein Beispiel fürs Forum. Im Code setzt ich
natürlich vernünftige Namen ein.
> 2.) Was du willst, könnte sich relativ leicht durch eine Funktion> erledigen lassen.
Naja, aber ich wollte mir halt den Funktionsoverhead durch ein Makro
sparen. So hätte ich ja einen Funktionssprung pro Task Überprüfung.
Insgesamt sind es 10 Task.
>> eine so deklarierte Funktion wird vom Compiler an der stelle eingesetzt> ohne, dass Overhead entsteht.> Dazu muss aber die Optimierung aktiviert sein.
inline kenne ich schon, aber dann müsste ich dieser Funktion ja einen
Funktionspointer auf meinen Task geben oder 10 inline Funktionen
definieren, schließlich habe ich ja auch 10 Task.
Aber danke für den Tipp!!
Sebastian B. wrote:
> #define MACRO(X,Y) X+=1;X=X%Y;>> aber dann geht ja sowas nicht:>>
1
>if(MACRO(X,10)==0){// Syntax Error
2
>Task();
3
>}
4
>
Wenn du das Macro in einem Ausdruck verwenden willst, darfst du
natürlich erst einmal kein Semikolon verwenden. Bei deinem speziellen
Problem eignet sich der Kommaoperator:
Christian S. wrote:
> UPS..>> Eigentlich mit if... aber hast es ja schon raus bekommen.
Nochmals ein DICKES DANKE in das Forum :-)
Der Code sieht jetzt um einiges übersichtlicher aus! :-)
Danke && Ciao ;-)
Sebastian B. wrote:
> inline kenne ich schon, aber dann müsste ich dieser Funktion ja einen> Funktionspointer auf meinen Task geben
Und wo genau ist da das Problem? Funktionen und (globale) Variablen
werden doch letztlich sowieso über Adressen referenziert.
Das hier
resultiert bei mir in genau dem gleichen Code wie die Variante mit Makro
und kann -- im Gegensatz zum Makro -- bei Bedarf auch noch einfach
entfehlert werden. Typüberprüfung zwecks Illusion einer gewissen
Sicherheit gibt's gratis dazu.
Gruß
Marcus