Hallo, ich programmiere zwar einen Controller, aber es ist eigentlich ein reine reine C Frage. Ich möchte gern eine Funktion schreiben, die mal den ersten ADC, mal zweiten ADC und mal beide ausließt, außerdem möchte ich mehr als einen Wert zurück geben. Ich könnte jetzt in der Funktion mit case arbeiten, das Frisst dann Zeit. Kann man sowas wie Präprozessorbefehle einfügen, wenn vor dem Funktionsaufruf schon klar ist, dass gewisse Teile nicht genutzt werden? Und was wäre die beste Variante mehrere Variablen zurück zu geben? Ein Einquetschen (codieren) in eine andere Variable, Globale Variablen, Pointer oder gibt es vielleicht bessere Varianten? Gruß Mark
Naja, mehrere Werte gibt man in C beispielsweise über ein lokales Array zurück bei dem man auf Elemente nach dem letzten Element zugreift. Damit erreichst Du die Rücksprungadresse, sowie die lokalen Variablen der aufrufenden Adresse. Und Du muss in C natürlich nicht an den Anfang einer Funktion springen, sondern kannst, beispielsweise mit Hilfe von Funktionszeigern auch an andere Adressen innerhalb der Funktion springen. Denk einfach daran, dass C nur ein komplexer Macro-Assembler ist.
1 | void readADC(uint16_t* val_1, uint16_t* val_2) |
2 | {
|
3 | if(val_1) |
4 | {
|
5 | *val_1 = .... |
6 | }
|
7 | if(val_2) |
8 | {
|
9 | *val_2 = .... |
10 | }
|
11 | }
|
12 | |
13 | uint16_t val_1, val_2; |
14 | |
15 | readADC(&val_1, NULL); |
16 | readADC(NULL, &val_2); |
17 | readADC(&val_1, &val_2); |
Christian Berger schrieb: > Naja, mehrere Werte gibt man in C beispielsweise über ein lokales Array > zurück bei dem man auf Elemente nach dem letzten Element zugreift. Damit > erreichst Du die Rücksprungadresse, sowie die lokalen Variablen der > aufrufenden Adresse. > > Und Du muss in C natürlich nicht an den Anfang einer Funktion springen, > sondern kannst, beispielsweise mit Hilfe von Funktionszeigern auch an > andere Adressen innerhalb der Funktion springen. > > Denk einfach daran, dass C nur ein komplexer Macro-Assembler ist. Alda! :D Haste nen Clown gefrüstückt?
> Ich möchte gern eine Funktion schreiben, die > mal den ersten ADC, mal zweiten ADC und mal beide > ausließt, abhängig wovon? Ich würde 2 Funktionen machen: eine die einen ADC ausliesst und eine zweite Funktion, die mit Hilfe der ersten Funktion 2 ADC ausliest.
1 | uint16_t readADC( uint8_t channel ) |
2 | {
|
3 | ....
|
4 | }
|
5 | |
6 | void readBothADC( uint16_t* value1, uint16_t* value2 ) |
7 | {
|
8 | *value1 = readADC( 0 ); |
9 | *value2 = readADC( 1 ); |
10 | }
|
void readADC(uint16_t* val_1, uint16_t* val_2) { if(val_1) { *val_1 = .... } if(val_2) { *val_2 = .... } } uint16_t val_1, val_2; readADC(&val_1, NULL); readADC(NULL, &val_2); readADC(&val_1, &val_2); ->genau so wirds gemacht.
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.