Wert innerhalb einer Funktion "durchreichen"

Hallo,

ich würde gerne einen an eine Funktion übergebenen Wert an eine innerhalb dieser Funktion sich befindenden Funktion "durchreichen".

Momentan habe ich es so gelöst (s.u.), möchte mir aber die Initialisierung von test in func_01() sparen, da ich ja bereits in func_02() und func_02() jeweils schon initialisiere.

void func_01(byte test)
{
  switch(sc_sel)
  {
  case 1:
    func_02(test);
    break;
  case 2:
    func_03(test);
    break;
  }
  blabla_01 = 1;
}

void func_02(byte test)
{
  // An dieser Stelle wird test benötigt
  blabla_02 = 1;
}

void func_03(byte test)
{
  // An dieser Stelle wird test benötigt
  blabla_03 = 1;
}

Geht das und falls, wie?

Gruß Chris

Chris72622:
ich würde gerne einen an eine Funktion übergebenen Wert an eine innerhalb dieser Funktion sich befindenden Funktion "durchreichen".

Sofern Du den Wert der Variablen als Kopie der Variablen durchreichen möchtest, ist es schon so richtig:
void func_02(byte test)
"test" ist dann eine unabhängige Kopie der Variablen mit demselben Wert der aufrufenden Variablen. Wenn Du innerhalb von func_02 den Wert von test veränderst, ändert er sich in der aufrufenden Funktion NICHT. Du arbeitest ja mit einer Kopie der Variablen, bzw. nur mit dem übergebenen Wert der Variablen, nicht mit der originalen Variablen selbst.

Es gibt aber auch die Möglichkeit, die Variable als Referenz auf die originale Variable durchzureichen, die Deklaration lautet dann:
void func_02(byte &test)
In dem Fall wird keine Kopie der Variablen angelegt und übergeben, sondern eine Referenz auf die Variable. D.h. wenn Du jetzt in func_02 den Wert von "test" änderst, dann ändert sich auch die als Parameter übergebene Variable in der aufrufenden Funktion. Und zwar auch dann, wenn die dort nicht zufälligerweise auch "test", sondern ganz anders heißt.

In diesem zweiten Fall kannst Du übrigens nur tatsächlich Variablen an die Funktion übergeben und nicht Konstanten wie etwas "func_02(5)", das würde zu einer Fehlermeldung des Compilers führen, weil es sich um keine Variable handelt, die geändert werden kann.

Die beiden Übergabemechanismen für Variablen nennen sich auf Neudeutsch "Call by Value" und "Call by Reference", falls Du etwas googeln möchtest.

Dank Dir!

Also kann ich mir das Byte in func_01() leider nicht sparen und es besteht auch nicht die Möglichkeit, dass func_02() und func_03() einfach auf das in func_01 definierte Byte "schauen", ohne dass ich in ihnen erneut jeweils ein Byte initialisieren muss?

Gruß Chris

Chris72622:
Also kann ich mir das Byte in func_01() leider nicht sparen und es besteht auch nicht die Möglichkeit, dass func_02() und func_03() einfach auf das in func_01 definierte Byte "schauen", ohne dass ich in ihnen erneut jeweils ein Byte initialisieren muss?

Damit verschiedene Funktion auf dasselbe, einmal deklarierte Byte schauen können, gibt es "globale Variablen". Als globale Variablen müssen diese außerhalb von Funktionen deklariert sein, dann können alle Funktionen darauf zugreifen.

Klar kannst du test global machen,
so wie du sc_sel, blabla_01, blabla_02, blabla_03 als globale Variablen hast.

Wobei ich diese blabla Variablen viel fragwürdiger finde als deine Bedenken, eine Variable durchzureichen.
Wofür sind die gut?

Eine richtige Funktion hat Eingangsparameter und liefert ein Ergebnis.
Beispiel:
y = sin(x);  // verändert den Wert von y, sonst nichts

In deinem Beispiel müsstest du per Kommentar erklären, dass
je nach Wert von sc_sel die Variablen blabla_02 und blabla_03 unverändert bleiben oder auch nicht, wenn du func_01 aufrufst.

Und das könnte man auch in func_01 so programmieren:

int func_01(byte sc_sel, byte test)
{
   switch (sc_sel)
   {
    case 1: blabla_02 = func_02(test); break;
    case 2: blabla_03 = func_03(test); break;
   }
   return 1;
}

Dann sieht man das schon im code von func_01, und man muss nicht nachschauen.
was func_02 und func_03 eigentlich wirklich machen, ausser nichts zurückzuliefern.

Aber wie schon gefragt : Wofür sind die gut?

void func_01() und void func_02() liegen aus Gründen der Übersichtlichkeit auf eigenen Tabs.

Gruß Chris

Chris72622:
void func_01() und void func_02() liegen aus Gründen der Übersichtlichkeit auf eigenen Tabs.

Eben. Um so schlechter, wenn man reingucken muss um zu sehen was sie machen.
In die Funktion [b] sin( ) [/b] habe ich noch nie reingeschaut, und bin trotzdem sicher, dass sie mir keine globale Variable verändert.

In "richtiger" c-Programmierung bräuchtest du Deklarationen

extern byte test;  // definiert im Haupt-Tab
void func03( );    // liegt im eigenen Tab und verändert blabla_03

... was dir die Arduino-IDE abnimmt. Globale Variable gehen über alle Dateien ( Tabs )