Rückgabewert einer Sub

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

MaximilianWe
**
Beiträge: 29
Registriert: Mo, 08.11.2010 20:25

Rückgabewert einer Sub

Beitrag von MaximilianWe »

ich will inerhalb einer Sub eine andere Sub aufrufen ( mit oder ohne CALL) und das Ergebnis dieser Sub als Rückgabewert weiter verwenden:
z.B.
sub Arbeit
....,
(Call) sub rechnen (x,y)
z = x + y
end sub
REM...z sollte jetzt in sub Arbeit verfügbar sein
ergebnis = z *15
end sub

das klappt aber nicht. Aber wie?

Max
Benutzeravatar
lorbass
********
Beiträge: 4116
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: Rückgabewert einer Sub

Beitrag von lorbass »

Was du beschreibst, ist nicht das Verhalten einer Sub, sondern das einer Function.

Gruß
lorbass
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Rückgabewert einer Sub

Beitrag von Stephan »

Code: Alles auswählen

Sub Arbeit()
  ergebnis = rechnen(3, 4) * 15
  Msgbox ergebnis
End Sub

Sub rechnen(x, y) As Integer
  rechnen = x + y
End Sub

Gruß
Stephan
MaximilianWe
**
Beiträge: 29
Registriert: Mo, 08.11.2010 20:25

Re: Rückgabewert einer Sub

Beitrag von MaximilianWe »

Hallo Stephan, wie immer gründlich und gnapp :D
Danke

Max
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Rückgabewert einer Sub

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:

Code: Alles auswählen

Sub Arbeit()
  ergebnis = rechnen(3, 4) * 15
  Msgbox ergebnis
End Sub

Sub rechnen(x, y) As Integer
  rechnen = x + y
End Sub
Weisst Du zufällig, ob die Verwendung von Rückgabewerten bei Prozeduren so gedacht und gewollt ist?
Dieses doch eher ungewöhnliche Verhalten ist mir auch neulich per Zufall aufgefallen, aber irgendwie scheint mir das nicht ganz "richtig" und widerspricht zudem der Beschreibung im OOo Wiki.

Abgesehen von der Leserlichkeit stellt sich mir da nämlich die Frage, ob derartig geschriebene Makros nicht möglicherweise in Zukunft auf einmal fehlerhaft sein könnten.
MaximilianWe
**
Beiträge: 29
Registriert: Mo, 08.11.2010 20:25

Re: Rückgabewert einer Sub

Beitrag von MaximilianWe »

DPunch hat geschrieben:Aloha
Stephan hat geschrieben:

Code: Alles auswählen

Sub Arbeit()
  ergebnis = rechnen(3, 4) * 15
  Msgbox ergebnis
End Sub

Sub rechnen(x, y) As Integer
  rechnen = x + y
End Sub
Weisst Du zufällig, ob die Verwendung von Rückgabewerten bei Prozeduren so gedacht und gewollt ist?
Dieses doch eher ungewöhnliche Verhalten ist mir auch neulich per Zufall aufgefallen, aber irgendwie scheint mir das nicht ganz "richtig" und widerspricht zudem der Beschreibung im OOo Wiki.

Abgesehen von der Leserlichkeit stellt sich mir da nämlich die Frage, ob derartig geschriebene Makros nicht möglicherweise in Zukunft auf einmal fehlerhaft sein könnten.
Was mich anbelangt, es funktioniert. Inzwischen schon einige dutzend Male. Von der Logik begriffen, habe ich es allerdings nicht. Ich habe jetzt vor, noch einige andere - immer wiederkehrende - größere Subs nach diesem Rezept zu basteln. Mal sehen, obs da auch funktioniert.

Max
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Rückgabewert einer Sub

Beitrag von Stephan »

Weisst Du zufällig, ob die Verwendung von Rückgabewerten bei Prozeduren so gedacht und gewollt ist?
Leider nein. Dazu müßte ich praktisch ein entsprechendes Spezifikationsdokument kennen, welches diese Funktion beschreibt, ich kenne jedoch keines.
Dieses doch eher ungewöhnliche Verhalten ist mir auch neulich per Zufall aufgefallen, aber irgendwie scheint mir das nicht ganz "richtig" und widerspricht zudem der Beschreibung im OOo Wiki.
Wenn ich mir irgendwas im Wiki anschauen soll brauchte ich den Link, mir ist nicht automatisch klar um welche Wikiseite es hier geht.
Abgesehen von der Leserlichkeit stellt sich mir da nämlich die Frage, ob derartig geschriebene Makros nicht möglicherweise in Zukunft auf einmal fehlerhaft sein könnten.
Seriös ist das nur mit einem "Ja, Aber" zu beantworten. Mindestbedingung für Zukunftsicherheit wäre spezifiziertes Funktionieren, das gibt es aber bei OOo an so vielen Stellen nicht, das ich fast denke es lohnt sich nicht ernsthaft darüber nachzudenken.

Das ist auch die Antwort die ich Dir aus meiner OOo-Berufspraxis geben würde, denn dort gebe ich praktisch nur noch Makros OOo-versionsweise frei, da auch bei erhöhtem Aufwand, zwecks Überlegungen zur zukunftssicheren Implementierung, keine verlässliche Implementierung möglich ist. In den 1er Versionen von OOo war das früher mal anders, aber seit 2.x ist die Lage leider so.
Man kann zwar auch heute Glück haben das Implementierungen nicht von von der OOo-Version abhängig sind, aber in den letzten Jahren gebe ich jegliche Dinge die ich beruflich für Kunden programmiere nur immer für konkrete OOo-Versionen frei und nicht mehr 'allgemein'.
Was mich anbelangt, es funktioniert. Inzwischen schon einige dutzend Male.
Ich denke die Frage von DPunch zielte wohl eher auf das Grundsätzliche.
Die LÖsung die ihm vorschwebt dürfte wohl sein:

Code: Alles auswählen

Sub Arbeit()
  ergebnis = rechnen(3, 4) * 15
  MsgBox ergebnis
End Sub

Function rechnen(x As Integer, y As Integer) As Integer
  rechnen = x + y
End Function
und das ich diese nicht gegeben habe hat damit zu tun das Du konkret nach Sub gefragt hast und ich mir dachte Du wirst DEine Gründe haben.

Wahrscheinlich hätte DPunch auch nichts gegen sowas:

Code: Alles auswählen

Global rechnen As integer

Sub Arbeit()
  berechnen(3, 4)
  ergebnis = rechnen * 15
  Msgbox ergebnis
End Sub

Sub berechnen(x, y)
  rechnen = x + y
End Sub

Gruß
Stephan
Benutzeravatar
Koala
**
Beiträge: 48
Registriert: Mi, 18.10.2006 12:58

Re: Rückgabewert einer Sub

Beitrag von Koala »

Auch wenn ich noch nicht so lange dabei bin ...
Irgendwo habe ich gelesen, dass nur Funktionen einen Wert zurückgeben können. Das es auch mit einer Sub geht, nun ja.
Ich verwende für Rückgaben lieber ausschließlich Funktionen. Ist irgendwie eindeutiger für mich.
Sven
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Rückgabewert einer Sub

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:Wenn ich mir irgendwas im Wiki anschauen soll brauchte ich den Link, mir ist nicht automatisch klar um welche Wikiseite es hier geht.
Konkret meine ich: OOo Wiki: Procedures and Functions
A function, just like a procedure, combines a block of programs to be executed into one logical unit. However, unlike a procedure, a function provides a return value.
Stephan hat geschrieben:Seriös ist das nur mit einem "Ja, Aber" zu beantworten. Mindestbedingung für Zukunftsicherheit wäre spezifiziertes Funktionieren, das gibt es aber bei OOo an so vielen Stellen nicht, das ich fast denke es lohnt sich nicht ernsthaft darüber nachzudenken.
Auf die Idee, da nochmal nachzuhaken, bin ich im Endeffekt auch nur gekommen, weil Du bei einer anderen Gelegenheit (leere Elemente in einem Array aus PropertyValues -> Post) darauf hingewiesen hattest, dass man zwecks "Zukunftssicherheit" lieber von Anfang an den sauberen Weg geht.
Dass Du hier keinerlei Bedenken beim Verwenden von Rückgabewerten bei Prozeduren hattest, hat mich aus irgendwelchen Gründen vermuten lassen, dass das Thema möglicherweise z.B. in ein Mail-Reader schonmal zur Sprache gekommen ist und Du daher vielleicht genaueres weisst.
Stephan hat geschrieben:Wahrscheinlich hätte DPunch auch nichts gegen sowas:

Code: Alles auswählen

Global rechnen As integer

Sub Arbeit()
  berechnen(3, 4)
  ergebnis = rechnen * 15
  Msgbox ergebnis
End Sub

Sub berechnen(x, y)
  rechnen = x + y
End Sub
Aus prinzipieller Abneigung gegenüber globalen Variablen dachte ich eher an das Ausnutzen der ByReference-Übergabe von Parametern, wobei das Ergebnis das gleiche bleibt, nur fühlt sich das Verwenden von Prozeduren mit Rückgabewerten für mein persönliches Verständnis einfach... "falsch" an.

Code: Alles auswählen

Sub Arbeit
	Dim ergebnis as Integer
	Berechnen(5,3,ergebnis)
	Msgbox ergebnis
End Sub

Sub Berechnen(a as Integer,b as Integer,ergebnis as Integer)
	ergebnis = a + b
End Sub
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Rückgabewert einer Sub

Beitrag von Stephan »

Auf die Idee, da nochmal nachzuhaken, bin ich im Endeffekt auch nur gekommen, weil Du bei einer anderen Gelegenheit (leere Elemente in einem Array aus PropertyValues -> Post) darauf hingewiesen hattest, dass man zwecks "Zukunftssicherheit" lieber von Anfang an den sauberen Weg geht.
Ja sicher, diese Kritik ist durchaus berechtigt.

ich schrieb die jetzige Lösung deshalb so wie ich sie geschrieben habe, weil:
... hat damit zu tun das Du konkret nach Sub gefragt hast und ich mir dachte Du wirst Deine Gründe haben.
Also das war mein Grund das zu tun.


Wenn Du mich jetzt aber im Nachhinein auf das Problem aufmerksam machts, würde ich nachträglich sagen:

(a)
bei dem Array-Beispiel lag ganz sicher ein Fehler vor, bei dem jetzigen Beispiel wahrscheinlich auch.

(b)
ich habe manchmal Gründe Dinge in abweichender Weise zu kommentieren, beispielsweise weil ich glaube aufgrund des 'Gegenüber' einen bestimmten Blickpunkt hervorheben zu müssen
(war jedoch hier nicht der Fall, mein Grund war ganz banal der den ich oben genannt habe)

(c)
ich bin nicht immer in gleicher Tagesform, manchmal sehe ich Dinge einfach anders auch ohne konkreten GRund, oder ich mache schlicht Fehler in meinen Aussagen




Nachhaken ist aber nie falsch.
Auch diskutiere ich sehr gerne solche Details, wie die um die es hier geht, weil ich das anregend finde, jetzt im Konkreten z.B. durch Dein Beispiel, weil ich diese Lösung zwar irgendwo auch kenne, sie praktisch aber nie benutze und sie deshalb meinerseits so in Vergessenheit war das ich sie nicht mal angeführt habe, weil sie mir nicht in den Sinn kam.



Gruß
Stephan
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Rückgabewert einer Sub

Beitrag von DPunch »

Aloha
Stephan hat geschrieben:Ja sicher, diese Kritik ist durchaus berechtigt.
Als Kritik war das gar nicht gemeint, sondern nur als Erklärung, warum ich da jetzt so explizit nachhake.
Jeder hat seine Gründe, warum er so oder so antwortet, ganz klar - ich habe den Grund halt irgendwie darin vermutet, dass Du als Moderator und Beteiligter des Projektes vielleicht mehr wissen könntest, als der normale Benutzer.
Nix für Ungut.
Stephan hat geschrieben:Auch diskutiere ich sehr gerne solche Details, wie die um die es hier geht, weil ich das anregend finde, jetzt im Konkreten z.B. durch Dein Beispiel, weil ich diese Lösung zwar irgendwo auch kenne, sie praktisch aber nie benutze und sie deshalb meinerseits so in Vergessenheit war das ich sie nicht mal angeführt habe, weil sie mir nicht in den Sinn kam.
Tatsächlich anwenden tue ich die Manipulation ByReference auch sehr, sehr selten, es ist aber trotzdem die einzige Lösung, die sich beim Verwenden von Prozeduren mit "quasi"-Rückgabewert wenigstens noch "richtig" anfühlt für mich - vielleicht bin ich da aber auch zu sehr in meiner Ausbildung und dem da gelernten gefangen.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Rückgabewert einer Sub

Beitrag von Stephan »

Als Kritik war das gar nicht gemeint, sondern nur [...]

Nix für Ungut.

Und ich werde es nimmer verstehen ... :wink: solange ich Denken kann war der Begriff Kritik für mich immer positiv besetzt, so jetzt selbstverständlich auch hier, (weil Kritik auf Fehler hinweist und das die Grundlage schafft Fehler zu korrigieren oder Bestehendes zu verbessern) und trotzdem glaubt jeder immer wenn ich etwas nur als Kritik benenne das er sich dann dafür entschuldigen müsse, weil er wohl meint wenn ich etwas als Kritik benenne das ich damit sagen will mich irgendwie negativ angegriffen zu fühlen.

Nun ja, ich werde mir trotzdem erlauben weiterhin Kritik als etwas Positives zu begreifen. :)



Gruß
Stephan
Antworten