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
  A4988 Driver mit einem Nema 17 Hangloose 3 140 04.09.2016 21:49
Letzter Beitrag: Hangloose
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 980 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Funktion mit Parameterübergabe - u8g torsten_156 8 400 22.06.2016 18:53
Letzter Beitrag: Pit
  Kann ich mit einem Arduino ein Gyro für Adroid Simulieren? Demitos 0 411 16.03.2016 18:33
Letzter Beitrag: Demitos
  Ansteuerung von einem Relais mit einem PS2 Controller minigarage 2 338 11.03.2016 15:31
Letzter Beitrag: minigarage
  Funktion in Loop einmalig ausführen Haustechno 4 646 09.03.2016 22:43
Letzter Beitrag: Haustechno
  Bei Tastendruck ein Ausgang mehr dazu.... hannes77 2 986 07.03.2016 20:48
Letzter Beitrag: hannes77
  HC-05 Modul auf Funktion prüfen. arduinofan 2 365 03.02.2016 19:18
Letzter Beitrag: arduinofan
  Eine Funktion vorher definieren ? arduinofan 23 2.021 30.12.2015 08:42
Letzter Beitrag: amithlon
  Wie steuere ich 2 DC Motoren über ein Motorshield mit einem Joystick? Vittelboy 12 5.585 29.12.2015 09:51
Letzter Beitrag: max123

Gehe zu:


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