Forum: PC-Programmierung nur spezielle Teile von Funktionen nutzen und mehrere Variablen zurück geben


von Mark (Gast)


Lesenswert?

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

von Troll (Gast)


Lesenswert?

Mark schrieb:
> Und was wäre die beste
> Variante mehrere Variablen zurück zu geben?

Array

von Christian B. (casandro)


Lesenswert?

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.

von --- (Gast)


Lesenswert?

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);

von Klaus (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

> 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
}

von olf79 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.