Ich selber habe eine Zeitschleife, die jede 100µs aufgerufen wird.
In dieser wird eine Funktion aufgerufen, der ich je nach Zählerstand die
obigen Defines weitergeben möchte. Gibt es eine schönere Möglichkeit das
ganze zu programmieren wie diese?:
1
staticuint8_tCnt=0;
2
3
if(Cnt==0)
4
func(MUX0);
5
if(Cnt==1)
6
func(MUX1);
7
if(Cnt==2)
8
func(MUX2);
9
...
10
11
Cnt++;
Man könnte natürlich auch func(0b00000), func(0b00001),... schreiben,
aber
ich würde schon gerne die defines aus der lib übernehmen.
Gibts da Möglichkeiten in C?
Ich danke im voraus! :)
Ich finde die Macros cool, richtige obfuscations nett geschrieben, muss
ich mir merken. Was bzw wie ist MUX1, MUX0 usw definiert ?
#define MUX0 ((0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) |
(0<<MUX0))
#define MUX1 ((0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) |
(1<<MUX0))
#define MUX2 ((0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (1<<MUX1) |
(0<<MUX0))
...
Diese Macros rufen sich alle irgendwie gegenseitig auf und die
eigentliche
Definition von MUX0, MUX1, MUX2 nach der Macroexpansion ist irgendwo
anders.
Kannst du bitte mal mehr posten, mich wuerde dies echt interessieren.
chris schrieb:> Diese Macros rufen sich alle irgendwie gegenseitig auf und die> eigentliche> Definition von MUX0, MUX1, MUX2 nach der Macroexpansion ist irgendwo> anders.
Glaub ich nicht. Das wurde schlicht vom TO falsch abgeschrieben.
Oliver
Wenn du denn die Defines benutzen möchtest. Allerdings stehen MUX0
....MUX2 auch nur für die binären Werte 0...2. Liesse sich also alles
einfacherer schreiben.
Zu Defines. In der ersten Zeile sind MUX0 bis MUX4 nicht definiert.
Nicht definierte Defines stehen für den Wert 0 --> MUX0=0.
In der Zweite ist nur MUX0 definiert. Für die anderen Defines gilt das
im vorigen Abschnittgesagte. Allerdings ist MUX0 it 0 definiert -->
MUX1=1
In der dritten Zeile sind nur MUX0=0 und MUX1=1 defniert. --> MUX2=2
und so weiter.
Marcel schrieb:> Schieb die Dinger doch in ein Array.
Hmmm. Ist zwar nicht zufriedenstellend, aber ist wohl der einzige
Ausweg.
Oliver schrieb:>> Diese Macros rufen sich alle irgendwie gegenseitig auf und die>> eigentliche>> Definition von MUX0, MUX1, MUX2 nach der Macroexpansion ist irgendwo>> anders.>> Glaub ich nicht. Das wurde schlicht vom TO falsch abgeschrieben.
Oliver hat recht. Ich habe einfach falsch abgeschrieben.
Hier also nochmals in Reinform der Code:
Bitte beachten, dass MUX_0, MUX_1, MUX_2... nicht einfach mit 0,1,2...
hochgezählt werden!!
Übrigens:
Es geht mir im Grunde auch nicht um eine Lösung für diese konkreten
Defines hier, sondern allgemein für alle Defines. Ich bin schon öfters
vor dem Problem gestanden, dass ich paar defines hoch-/runterzählen
musste.
Die einzige Lösung, die ich bis jetzt für möglich halte ist:
Decius schrieb:> Nicht definierte Defines stehen für den Wert 0
Nur im Präprozessor, also wenn sie innerhalb eines #if auftauchen.
Für den C-Compiler werden die nicht als Makros definierten Namen dann
1:1 als Text durchgereicht.
Ist aber komisch das der Keil Compiler die Defines ohne die vorherige
definition von MUX0, MUX1 und MUX2 akzeptiert. Eigentlich hatte ich da
eine Fehlermeldung erwartet.
Ahh ok. Jetzt klärt es sich. Die erwarteten Fehlermeldungen kommen, wenn
man versucht die Defines ohne die vorherige definition von MUX0, MUX1
und MUX2 zu benutzen. Hätte mich jetzt auch echt gewundert. unhd stimmt
an die Variantge das die Defines zunächst nur als Text interpretiert
werden hab ich nicht gleich gedacht.
Du kònntest hier auch , in diesem fiktiven Beispiel func(0),func(1);
schreiben. In diesem Beispiel, wenn man auch nur eine kleine aenderung
macht an den Schiebeoperationen hat, durch die rekursive Einbindung
hat man dann einen defierte Initialisierung oder pseudo pnr.
Wenn ein Teil mit sowas arbeitet, und ein Teil mit defines, dann ist in
der Tat der Flow des Programmes nicht leicht nachzuvollziehen, speziell
wenn Variablen damit initialisiert werden und die Konstanten in
FOR/While/IF verwendet werden. Der Compiler optimiert das alles
automatisch weg, auch den Code mit eventuellen Decription Algorithm,
welcher dann eigentlich nicht mal reinkompiliert wird und der
eigentliche Key und
Algorithmus ist nur schwer rauszubekommen.
# 1 "x.c"
Die wurde doch schon geklàrt.
Siehe untenstehenden Code.
Egal welche Werte MUXn hat, es wird neu definiert und abgesehen von
dem blòden Defines werden die neu umdefiniert.
Ein
#define MUX0 0
#define MUX1 1
#define MUX2 2
ist exact dasselbe als der orginale define Code.
Sinn muss/kann diese Neudefinition haben, da offensichtlich MUXn
irgendwie
schon definiert ist, hier im Codebeispiel als Enum gemacht.
Ich wuerde dir die obige Definition zu Herzen legen, da sie viel
uebersichtlicher ist, ist aber egal.
Das daten[3] wird auch immer mit { 0,1,2 } initialisert, allerdings die
For Schleife Zaehlt nur von 0 bis 1, da < 2 genommen wurde, kann ein
Tippfehler sein.
Anstelle von
for(i=MUX0; i<MUX2; i++)
{
func(daten[i]);
}
kannst du auch, bzw warscheinlich besser
for(i=0; i<2; i++)
{
func(daten[i]);
}
Wenn dies ein Tippfehler war, und es <=2 heissen sollte, dann koennte
sowas
vorteilhaft sein, bzw wird oefter gemacht um bei Erweiterungen keine
grossen Codeaenderungen zu haben.
for(i=0; i<sizeof(daten)/sizeof(daten[0]); i++)
{
func(daten[i]);
}
typedef unsigned char uint8_t;
enum { MUX0=9,MUX1=4,MUX2=5,MUX3=2,MUX4=12 };
#define MUX0 ((0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) |
(0<<MUX0))
#define MUX1 ((0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) |
(1<<MUX0))
#define MUX2 ((0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (1<<MUX1) |
(0<<MUX0))
uint8_t daten[MUX2+1] = {MUX0,MUX1,MUX2};
void func(uint8_t value)
{
printf(" called with %d\n",value);
//irgendwas
}
int main (void)
{
uint8_t i;
for(i=MUX0; i<MUX2; i++)
{
func(daten[i]);
}
puts("daten:");
for(i=0; i<3; i++)
{
func(daten[i]);
}
}