Funktion mit Wertrückgabe ?

Ja, der Prototyp Parser wurde was structs betrifft inzwischen etwas verbessert. Er macht aber manchmal immer noch Probleme.

Es geht auch ohne namespaces wenn man den Funktionsprototsyp einfach per Hand erstellt.

Ansonsten ist die Rückgabe von Objekten dank Return Value Optimization nicht so verschwenderisch wie es es auf den ersten Blick erscheint. Der Aufruf des Copy Konstructors kann wegoptimiert werden. Es wird Speicher in der aufrufenden Funktion angelegt und dieser wird direkt von der aufgerufenen Funktion beschrieben. Sieht man schön wenn man den Copy Konstruktor per Hand erstellt und darin eine serielle Ausgabe macht. Und dann diese Optimierung mal per -fno-elide-constructors deaktivert.

struct S
{
  S()
  {}
  
  S(const S&)
  {
    Serial.println("Kopie");
  }
};

S func()
{
  return S();
}

void setup() 
{
  Serial.begin(9600);

  S s = func();
}

void loop() 
{
}

Das sollte normal nichts ausgeben

Mit -fno-elide-constructors kommt dagegen das:

Kopie
Kopie

Zwei Kopien weil das Objekt schon zwischen Erstellung und der Rückgabe in der Funktion einmal kopiert wird.

jurs:
...

Trotzdem kann eine Funktion auch mehrere Werte "zurückgeben", und zwar wenn Du diese Werte auch vorher auch an die Funktion "übergeben" hast, und zwar als Parameter mit spezieller Aufrufkonvention.

Bei der Parameterübergabe an Funktionen gibt es zwei Möglichkeiten:

  1. Call by Value ==> Parameter als Wert an die Funktion übergeben
  2. Call by Reference ==> Parameter als Referenz an die Funktion übergeben

Die "by Value" übergebenen Parameter können Konstanten sein, oder Variablen, die nach der Rückkehr aus der Funktion unverändert sind.

Die "by Reference" übergebenen Parameter werden als Adressreferenz an die Funktion übergeben, und wenn die Funktion diese Parameter in der Funktion verändert und die Funktion kehrt zurück, dann haben diese Parameter ihren veränderten Wert!

...

DANKE, das war genau das was ich in diesem Thread zu finden hoffte. Aus uralten Zeiten wusste ich, dass dies in anderen Hochsprachen möglich ist. Sogar die Deklaration der Übergabeparameter "by val" und "by ref" fielen mir wieder ein. Aber Deine einfache, präzise und doch sehr anschauliche Erklärung hat mich glaube ich zum ersten mal verstehen lassen, was der Unterschied ist und wie er sich auswirkt.

Mein konkretes Problem bestand darin, dass ich neben dem eigentlichen Funktionswert auch die Zeit zurückgeben wollte, welche für die Berechnung dieser Funktion benötigt wurde (while schleife mit interaktiver Ausstiegsbedingung). Da ich die Rückgabe nicht hinbekam , habe ich den unsauberen Weg über eine globale Variable gewählt. Das Funktioniert zwar und wird in diesem Thread auch mehrmals fragwürdiger Weise so empfohlen, aber es störte meine etwas eingestaubte Programmierer Ehre.
Es ist doch ein Unding, für die modulare Nutzung einer SubRoutine die Verwendung einer globalen Variable mit bestimmten Namen vorzuschreiben. Selbst wenn ich diese Programme nur für mich selbst schreibe, ist diese Art der Programmierung extrem unsauber.

Daher nochmal mein Dank an Deine perfekte Erklärung!

Gruß
Fredogar

Ja. Schade, dass jurs seit zweieinhalb Jahren nicht mehr dabei ist. Wie die Zeit vergeht...

[ O T ]
Ganz generell wäre es übrigens in deinem Fall (Messen, wie lang die Ausführung einer Funktion braucht) schöner, das außerhalb der Funktion zu machen. Eine Funktion sollte nur das machen, was ihr Name sagt.(Meine Meinung)
Und meist wäre noch schöner, wenn eine Funktion praktisch keine Zeit braucht und statt Warteschleifen sofort mit "noch nicht fertig" zurückkommt.
Bei "Interaktiv" will ich gar nicht raten, was du damit meinst. Wartest du tief im Innern einer irgendwo verschachtelt versteckten Funktion auf eine Benutzer-Reaktion?

Selbst wenn ich diese Programme nur für mich selbst schreibe, ist diese Art der Programmierung extrem unsauber.

Hmm. :stuck_out_tongue:

Wenn du in der Richtung weiter diskutieren willst, mach lieber einen eigenen Thread auf

[ / O T ]

Hallo,

was man vor 7 Jahren so für interessante Fragen gestellt ... :grin:

Neben jurs ist auch udoklein nicht mehr aktiv. Vielleicht schauen sie uns von oben auf die Finger. Wer weiß. :confused:
Ohne die anderen Nicht-Aktiven schmälern zu wollen, dass sind Namen die man sich irgendwie eingeprägt hat.
Dafür sind andere Namen nachgerückt die ich mir merke.