PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variablen in Unterprogramm übergeben und mit zurück nehmen ?



delaware
02.03.2010, 15:56
Moin,

ich möchte eine Variable in ein Unterprogramm "mitnehmen" dort bearbeiten und wieder mit "zurücknehmen" z.b.





int main(void)
{
int16_t a;
int16_t b;

a=53;
b=12;

while (1)
{
unterprogramm (a,b); //jetzt Unterprogramm o. Routine aufrufen Variablen a und b "mitnehmen"
b++; // b um eins erhöhen
...
Jetzt Ausgabe z.b. Display oder so a & b wobei a nicht hochgezählt wurde
...
}
}

void unterprogramm (int a,int b)
{
a++; // a um eins erhöhen
... b an dieser Stelle ausgeben funzt einwandfrei ...
}



Variable a wird nicht hochgezählt (zumindest kann dies in main nicht
ausgegeben werden).


Einrückungen gingen leider verloren, #include .. wurde hier weggelassen.

Ich hoffe ich konnte mich verständlich ausdrücken.

yaro
02.03.2010, 16:15
Da gibts zwei Möglichkeiten für:

1) Du gibst den Wert der Variable als Rückgabewert der Funktion zurück (mit return)

2) Du übergibst nicht eine Variable (die in der Fnktion kopiert wird, um mit der Kopie weiterzuarbeiten) sondern einen pointer auf diese Variable.

Gruß, Yaro

delaware
02.03.2010, 16:47
Kurzes Beispiel ?

askazo
02.03.2010, 17:53
zu 1)


int mache_was (int x)
{
x++;
return x;
}

//Aufruf:
a = mache_was(a);


Nachteil dieser Methode: Du kannst in einer Funktion nur eine Variable zurückgeben. Arrays als Rückgabewert sind nicht erlaubt.

zu 2)


void mache_was(int *x, int *y)
{
(*x)++;
(*y)++;
}

//Aufruf:
int a, b;
mache_was(&a,&b);


Gruß,
askazo

BurningWave
02.03.2010, 17:53
1. Möglichkeit mit return:



int add(int a, int b)
{
return a+b;
}

void main()
{
int a=9; b=15;
int c = add(a, b); //c = 24
}

2. Möglichkeit mit Übergabe der Werte als Referenzen:



int add(int* a, int* b)
{
*a = *a + *b; //Hier wird der Wert an Speicheradresse a verändert
}

void main()
{
int a=9; b=15;
add(&a, &b); //a = 24 (Es wird nicht die Variable, sondern ihre Speicheradresse übergeben)
}

mfg

BurningWave
02.03.2010, 17:55
Da war jemand schneller...

michl78
02.03.2010, 20:08
Wenn Du mehrere Variablen aus der Funktion zurückhaben willst / musst, definier Dir in main() ein struct, übergebe der Funktion dieses Struct als Pointer, in der Funktion kannst Du dann nach Belieben die einzelnen Variablen dieses Structs beschreiben und in main() wieder auslesen.

BurningWave
02.03.2010, 20:24
Wenn es nur ein paar Variablen sind, sind einfache Referenzen sinnvoller.

michl78
02.03.2010, 20:31
Definitiv nicht. Eine Strukturvariable braucht weniger Speicher, ist wesentlich besser zu lesen und zu handhaben. Warum sollten mehrere getrennte Pointer denn sinnvoller sein???

BurningWave
02.03.2010, 21:14
Strukturen sind sinnvoll, wenn man mehr wie 2 - 3 Variablen hat und diese auch wirklich an mehreren Stellen benutzt. Es ist aber nicht sinnvoll für jede kleine Funktion, der man 2 Variablen übergeben möchte eine Struktur zu erstellen.

michl78
03.03.2010, 08:17
Ich rede nicht vom Übergeben an die Funktion, sondern von der Rückgabe aus der Funktion. Wenn die Funktion mehr als einen Wert verändern soll, und die Variablen irgendwie in einem Bezug zusammen stehen, bietet sich eine Struktur eben an, schon allein um die Lesbarkeit des Codes zu verbessern.

Deine Aussage "Es ist aber nicht sinnvoll für jede kleine Funktion, der man 2 Variablen übergeben möchte eine Struktur zu erstellen" ist natürlich richtig, wenn nur ein Wert zurückgeliefert werden soll, dann ist die Pointerei ja auch gar nicht nötig.

Ich finde nicht, dass es ein großer Aufwand ist, eine Struktur zu definieren.
Ich gehe auch davon aus, daß die Funktion an mehreren Stellen im Programm verwendet wird, sonst wäre es ja auch nicht sehr sinnvoll, extra eine Funktion dafür zu schreiben, dann könnte man den Code ja auch gleich an der einen Stelle statt des Funktionsaufrufes schreiben.