-
        

Ergebnis 1 bis 10 von 10

Thema: Rückgabewert aus einer Function

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235

    Rückgabewert aus einer Function

    Anzeige

    Hallo,

    kann eine function einen Wert auch als Parameter an das Hauptprogramm zurückgeben, ohne das dieser Parameterwert global deklariert ist;
    z.B durch die gleiche Stellung in der Parameterliste in Aufruf und function?

    Wenn ja, wie geht das dann?

    Gruß
    fredyxx

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    938
    Ja, indem man einen passenden (typbehafteten) Zeiger auf den Speicherort des fraglichen Parameters übergibt.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    Zitat Zitat von RoboHolIC Beitrag anzeigen
    Ja, indem man einen passenden (typbehafteten) Zeiger auf den Speicherort des fraglichen Parameters übergibt.
    Hallo, so klappt es mit dem 3. Parameter nicht! Wie wäre es richtig?

    Code:
    void setup() {
    
      Serial.begin (250000);    //  diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
      while (!Serial);
    
    }
    
    void loop() {
    
    
      Serial.print ("lzahn2 = ");
      Serial.println (lzahn2Prog (213.56994, 57.56108,  float xyz));     //  Druckt Ergebnis des UPs
    
      delay(2000);
    
    }
    
    
    //  **************************************Unterprogramm lzahn2Prog  *******************************
    
    
    float lzahn2Prog ( float x1, float y1,  W4) {
    
      float P0_P1 = sqrt(pow(x1, 2) + pow(y1, 2));              //Gerade P0-P1
    
      float CosinusW4 = (114196.0 - pow(P0_P1, 2)) / 102960.0;
      float W4 =  acos(CosinusW4);                               // = W4 im Bogenmaß
      float lzahn2 = sqrt(   21164.49 - cos (W4 +  0.09180432) *  20574.0   );
    
    
    
       return lzahn2;     // die Ausgabe erfolgt in mm
    
    }
    Gruß
    fredyxx

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Zeigervariante
    Code:
    void setup() {
      Serial.begin (250000);    //  diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
      while (!Serial);
    }
    
    void loop() {
      float xyz;
      Serial.print ("lzahn2 = ");
      Serial.println (lzahn2Prog (213.56994, 57.56108, &xyz ));     //  Druckt Ergebnis des UPs
      Serial.println (xyz);     //  Druckt xyz
      delay(2000);
    }
    
    
    //  **************************************Unterprogramm lzahn2Prog  *******************************
    
    
    float lzahn2Prog ( float x1, float y1, float* W4) {
      float P0_P1 = sqrt(pow(x1, 2) + pow(y1, 2));              //Gerade P0-P1
    
      float CosinusW4 = (114196.0 - pow(P0_P1, 2)) / 102960.0;
      *W4 =  acos(CosinusW4);                               // = W4 im Bogenmaß
      float lzahn2 = sqrt(   21164.49 - cos (*W4 +  0.09180432) *  20574.0   );
    
       return lzahn2;     // die Ausgabe erfolgt in mm
    }
    Referenzvariante
    Code:
    void setup() {
      Serial.begin (250000);    //  diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
      while (!Serial);
    }
    
    void loop() {
      float xyz;
      Serial.print ("lzahn2 = ");
      Serial.println (lzahn2Prog (213.56994, 57.56108, xyz ));     //  Druckt Ergebnis des UPs
      Serial.println (xyz);     //  Druckt xyz
      delay(2000);
    }
    
    
    //  **************************************Unterprogramm lzahn2Prog  *******************************
    
    
    float lzahn2Prog ( float x1, float y1, float& W4) {
      float P0_P1 = sqrt(pow(x1, 2) + pow(y1, 2));              //Gerade P0-P1
    
      float CosinusW4 = (114196.0 - pow(P0_P1, 2)) / 102960.0;
      W4 =  acos(CosinusW4);                               // = W4 im Bogenmaß
      float lzahn2 = sqrt(   21164.49 - cos (W4 +  0.09180432) *  20574.0   );
    
       return lzahn2;     // die Ausgabe erfolgt in mm
    }

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    PRIMA, danke

    Gruß
    fredyx

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.453
    hallo,
    was mich ganz nebenbei etwas stutzig macht, ist dein
    Serial.begin (250000);
    das funktioniert?
    üblich ist eher was in der Größenordnung bis max.
    Serial.begin (115200);
    was schon sehr schnell ist, aber es könnte sein, dass die Arduino IDE die 250000 automatisch auf default zurücksetzt.

    ---

    zurück zum Topic:

    es ist kein "schöner Programmierstil" und stört auch das Verstehen und Debuggen, wenn du sowohl als Rückgabewert als auch bei den Parametern eine Wert-Änderung durchführst.
    (Abgesehen davon, dass mir unklar ist, wieso du überhaupt beide Werte (lzahn2Prog Rückgabewert und W4) in derselben Funktion berechnest bzw. änderst...)

    "schöner", "üblicher" und "lesbarer" ist:
    a) wenn nur 1 Wert zu ändern oder zurückzugeben: als Rückgabewert oder per Referenz (&) oder per Zeiger(*) bei den Parametern
    b) wenn 1 Wert benötigt wird, um die richtige Ausführung zu kontrollieren, dann diesen als Funktions-error-Wert zurückgeben.
    c) wenn mehrere Werte geändert werden, mit denen "gerechnet" wird, dann alle als Parameter, nicht den/die einen als Parameter und einen anderen als Funktionswert..
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Eingedampfte Variante:
    Code:
    float w4berechnen (float x1, float y1) {
      return acos((114196.0 - x1*x1 + y1*y1) / 102960.0);
    }
    
    float lzahn2berechnen (float W4) {
      return sqrt(   21164.49 - cos (W4 +  0.09180432) *  20574.0  );
    }
    
    void setup() {
      Serial.begin (250000); 
      while (!Serial);
    }
    
    void loop() {
      float x1 = 213.56994;
      float y1 = 57.56108;
      float w4 = w4berechnen(x1, y1);
      float lzahn2 = lzahn2berechnen(w4);
      
      Serial.print ("lzahn2 = ");
      Serial.println (lzahn2 );  
      Serial.print ("w4 = ");
      Serial.println (w4);     
      delay(2000);
    }

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.453
    Wunderwunderschön


    eingedampfte, sublimierte und obfuscierte Variante:

    Code:
    void loop() {
      float x1 = 213.56994;
      float y1 = 57.56108;
      float lzahn2 = sqrt(   21164.49 - cos ( ( acos((114196.0 - x1*x1 + y1*y1) / 102960.0) ) +  0.09180432) *  20574.0  );
      Serial.print ("lzahn2 = ");
      Serial.println (lzahn2 );  
      delay(2000);
    }
    nein, Sisor's Variante ist wirklich schöner
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    18.03.2013
    Beiträge
    235
    was mich ganz nebenbei etwas stutzig macht, ist dein
    Serial.begin (250000);
    das funktioniert?
    Ja funktioniert

    (Abgesehen davon, dass mir unklar ist, wieso du überhaupt beide Werte (lzahn2Prog Rückgabewert und W4) in derselben Funktion berechnest bzw. änderst...)
    Es ging mir im Moment nur mal darum zu erfahren, ob und wie es denn geht.

    Da das, was ihr oben seht nur ein sehr kleiner Teil von dem sein wird, was ich noch machen will, dachte ich mir, dass die Funktionen/ Unterprogramme doch einen gewissen Funktionsblock darstellen sollten, damit das Programm nachher noch einigermaßen übersichtlich ist und nicht aus lauter Funktionen mit nur einer Formel besteht. Da ich aber erst am Anfang stehe, stecke ich sowohl mit Konzept als auch mit den Programmierkenntnissen noch in den Kinderschuhen.
    Am Ende soll das mal die Steuerung für ein Baggermodell mit 6 Motoren werden, das selbstständig verschiedene Programme abfahren soll.

    Gruß
    fredyxx
    Geändert von fredyxx (20.05.2016 um 00:11 Uhr)

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.453
    Zitat Zitat von fredyxx Beitrag anzeigen
    Ja funktioniert
    edit:

    du hast recht, ich habe nachgesehen, es könnte tasächlich funktionieren, es wird "nur empfohlen", bestimmte Werte für die serielle Konsole (PC) bis max. 115200 zu verwenden: https://www.arduino.cc/en/Serial/Begin
    Geändert von HaWe (20.05.2016 um 09:55 Uhr)
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

Ähnliche Themen

  1. Rückgabewert einer Funktion verwerfen
    Von Liquidator im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 04.05.2016, 17:22
  2. Function unter Bascom mit Rückgabewert
    Von rogerberglen im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.03.2010, 23:54
  3. Funktion als Rückgabewert einer Funktion?
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 08.09.2008, 11:25
  4. ungewollt geänderte Variable in einer function - spuk?
    Von mathias172 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 02.01.2008, 01:48
  5. Übergabewert einer Function
    Von bertl100 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 06.05.2005, 11:49

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •