INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Funktion/Methode mit mehr als einem Ausgangswert
19.10.2015, 13:31
Beitrag #1
Funktion/Methode mit mehr als einem Ausgangswert
Hallo zusammen!

Ich wollte gerne wissen. ob es möglich ist eine Methode zu schreiben, die mir ein Array oder halt mehr als nur ein Wert vom Typ float zurück gibt?

Bei meinen ersten Suchanfragen bin ich auf keine solche Lösung gestoßen.

Gruß
Marduino_UNO
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 14:08 (Dieser Beitrag wurde zuletzt bearbeitet: 19.10.2015 15:39 von HaWe.)
Beitrag #2
RE: Funktion/Methode mit mehr als einem Ausgangswert
hallo,
klar, gibt es, das Zauberwort heißt "Pointer" (auf einen Array)

Code:
float * myfunction(...) {
   float * fret;
   //  dein Code
   return fret;
}

liefert dir einen Float-Array zurück.

Um keine Speicher/Pointerprobleme zu kriegen, bietet es sich an, den Array vorher im aufrufenden Programm zu definieren

Code:
float myarray[10];
und ihn dann als Parameter an die Funktion zu übergeben

Code:
float * myfunction(float arr[]) {
  float * fret = arr;

// dein code...
  return fret;
}

void loop() {
   float myarray[10];
   float * fbuf; // geht sicher auch schöner

   //...
  fbuf = myfunction(myarray[]);
  // memcpy(myarray, fbuf, sizeof(myarray) ); // berichtigt, kann sogar komplett weg.
  //...  

}

so müsste es gehen - vlt sogar noch einfacher....
(oder, Thorsten? Wink )
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 15:30
Beitrag #3
RE: Funktion/Methode mit mehr als einem Ausgangswert
(19.10.2015 14:08)HaWe schrieb:  Um keine Speicher/Pointerprobleme zu kriegen, bietet es sich an, den Array vorher im aufrufenden Programm zu definieren
...und deshalb würde ich so einen Vorschlag gar nicht erst machen.
Zitat:
Code:
memcpy(myarray, fbuf, sizeof(fbuf) );
Das ist unnötig und falsch. sizeof(fbuf) ist die Größe des Pointers, also auf einem Uno 2 und auf einem Due 4. Du meinst wahrscheinlich so etwas wie sizeof(myarray). Ich bin mir aber auch nicht sicher und würde da immer sowas wie 10 * sizeof(float) schreiben.
Anyway, es ist eh unnötig, da fbuf schon auf denselben Speicher zeigt wie myarray.

So, jetzt zu den Lösungen, die mir einfallen.

1. Call-by-Reference
D.h. man übergibt die Adresse der zu überschreibenden Variablen an die Funktion
Code:
void myFunc(float &v1, int &v2, char &v3) {
   v1 = 3.1415;
   v2 = 42;
   v3 = 'Q';
};

// ...

void loop() {
//...
    float myFloat;
    int myInt;
    char myChar;
    myFunc(myFloat, myInt, myChar);
//...
};
Das verändert tatsächlich die Werte auch außerhalb der Funktion. Allerdings mag ich das nicht besonders, da es die Seiteneffekte auf die Variablen myFloat, myInt, myChar verschleiert. Folgendes ist meiner Meinung nach klarer:

2. Pointer
D.h. man übergibt die Adresse der zu überschreibenden Variablen an die Funktion
Code:
void myFunc(float *v1, int *v2, char *v3) {
   *v1 = 3.1415;
   *v2 = 42;
   *v3 = 'Q';
};

// ...

void loop() {
//...
    float myFloat;
    int myInt;
    char myChar;
    myFunc(&myFloat, &myInt, &myChar);
//...
};
Das wird wahrscheinlich zum selben Maschinencode übersetzt, aber meiner Meinung nach ist es klarer.

3. Arrays
Das ist so ähnlich wie mit Pointern, nur dass es etwas einfacher aussieht. Außerdem sollte man die Größe des Arrays mitgeben, wenn sie nicht eh klar ist. Die Runtime weiß die Größe eines Arrays nicht. Tatsächlich gibt es gar keine Arrays, es gibt nur Pointer. (Den Löffel gibt es gar nicht...)
Code:
void myFunc(float *myArr, int size) {
   for(int i = 0; i < size; i++) {
      myArr[i] = i * i;  
   };
};

// ...

void loop() {
//...
    float anArray[10];
    myFunc(anArray, 10);
//...
};

4. Verwendung von struct
Code:
typedef struct {
   float aFloat;
   int anInt;
   char aChar;
} multiVar;  

multiVar myFunc() {
   multiVar retVal;
   retVal.aFloat = 3.1415;
   retVal.anInt = 42;
   retVal.aChar = 'Q'.
   return retVal;
};

// ...

void loop(){
//...
   multiVar blabla = myFunc();

//...
}

5.-27. (oder so) Verwendung von Klassen
Das will ich jetzt nicht weiter ausführen, nur ein paar Hinweise: Es fängt so ähnlich an wie das mit dem Struct, dann kann man einen Konstruktor einführen.
Wenn man nun noch dynamische Arrays haben will, dann kann man das auch als Klassenattribute haben. Diese kann man dann im Destruktor automatisch löschen. So kann man es hinbekommen, dass man trotz dem Erzeugen von Arrays in Funktionen/Methoden, eine einigermaßen sichere Speicherverwaltung hat.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 15:38
Beitrag #4
RE: Funktion/Methode mit mehr als einem Ausgangswert
klar mit dem sizeof, das war ntl falsch, habe es verbessert.
Aber er fragte nach einem float Array als Rückgabewert einer Funktion, nicht Übergabe "per Reference".
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 15:46
Beitrag #5
RE: Funktion/Methode mit mehr als einem Ausgangswert
Hi,
ich fand es angebracht, ein paar mehr Ideen aufzuzeigen und nicht nur genau auf diese Frage zu antworten. Außerdem hat er nicht nur nach "float array" gefragt. Du kannst aber gerne alles bis auf das mit dem struct und den Klassen ignorieren.
Auch wenn Du das mit dem sizeof verbessert hast: Diese Zeile bewirkt nichts, außer die Entropie des Universums zu erhöhen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 15:51
Beitrag #6
RE: Funktion/Methode mit mehr als einem Ausgangswert
dewegen ist die Zeile ja auch auskommentiert.
Ich wollte sie nur stehen lassen, damit der Thread nicht unverständlich wird.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 15:52
Beitrag #7
RE: Funktion/Methode mit mehr als einem Ausgangswert
(19.10.2015 15:51)HaWe schrieb:  dewegen ist die Zeile ja auch auskommentiert.
Ich wollte sie nur stehen lassen, damit der Thread nicht unverständlich wird.
Mea culpa. Meine Augen...

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.10.2015, 16:06 (Dieser Beitrag wurde zuletzt bearbeitet: 19.10.2015 16:50 von HaWe.)
Beitrag #8
RE: Funktion/Methode mit mehr als einem Ausgangswert
dann stimmt es jetzt so?
(19.10.2015 14:08)HaWe schrieb:  
Code:
float * myfunction(float arr[]) {
  float * fret = arr;
   // dein code...
  return fret;
}


void loop() {
   float myarray[10];
   float * fbuf;

   //...
   // falsch: fbuf = myfunction(myarray[]);
   fbuf = myfunction(myarray);  // berichtigt, na klar.
   //...  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Zwei identische I2C sensoren an einem Bus Karli 19 737 02.04.2018 22:13
Letzter Beitrag: Harry
  Millis verzögern Funktion? malsehen 14 573 29.03.2018 21:47
Letzter Beitrag: hotsystems
  328P geht nicht mehr [gelöst] Harry 37 2.347 04.03.2018 19:57
Letzter Beitrag: Harry
  "undefined reference to Class::Methode" obwohl definiert da_user 9 347 21.02.2018 23:33
Letzter Beitrag: Tommy56
  byte´s zu einem String zusammenfassen ? Franz54 18 1.104 31.01.2018 10:10
Letzter Beitrag: MicroBahner
  Mehrere Ausgänge mit einem Befehl auf High oder Low setzen dahans 1 507 10.01.2018 12:48
Letzter Beitrag: Tommy56
Bug I2C Displays wollen nicht mehr Der Ausserirdische 12 759 30.12.2017 17:11
Letzter Beitrag: hotsystems
  Eine Funktion verlassen Jan5663 8 753 18.12.2017 13:49
Letzter Beitrag: Chopp
  RC Anwendung mit 3 Empfängereingangen und einem MPU6050 Thorsten_S 19 1.244 10.12.2017 19:59
Letzter Beitrag: Tommy56
Question Mehrere HX711 an einem Arduino Nano Lambacher 59 4.198 17.10.2017 09:34
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste