Deutsch
Forum

Mehrere Return Werte

 

Hubert
Binnewies
Hallo zusammen..

Kleines Problem..
Ich würde mir gerne ein paar Funktionen schreiben die mir das Programmieren an meinem derzeitigen Projekt vereinfachen.
Das Blöde ist nur das ich in den meisten Funktionen mehrere Rückgabewerte habe.

Ich hab die Hilfe in Xprofan durch und immer nur gesehen das man mit RETURN nur einen Wert zurück geben kann.

Oder hab ich da was übersehen?

Wie kann ich mehrere Werte zurückgeben?

Danke schonmal im voraus.

Hubert
 
WinXP Prof, XProfan 9.1 Newbie

Ein kluger Kopf sagte mal:
"Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!"
15.09.2006  
 




RGH
Nein, Du hast nichts übersehen: Wie in allen anderen Sprachen auch hat eine Funktion extakt ein Funktionsergebnis und somit einen Rückgabewert.

Prinzipiell gibt es zwei Möglichkeiten, diese Limitierung zu umgehen:

1. Zum einen könntest Du mehrere Werte als Teilstring eines Strings übergeben. XProfan hat, besonders ab Version 10, mächtige Befehle zum Umgang mit Substrings. So könnte zum Beispiel in der Prozedur stehen:
KompilierenMarkierenSeparieren
!return str$(x%) + ";" + str$(y) + ";" + str$(z%)

Im aufrufenden Programm sähe es dann so aus:
KompilierenMarkierenSeparieren
!erg$ = meineFunktion()
x% = val(substr$(erg$,1,";")
y% = val(substr$(erg$,2,";")
z% = val(substr$(erg$,3,";")

2. Die andere Möglichkeit ist die Verwendung einer Struktur bzw. eines Objektes, da hierbei ja nur der Zeiger an die Funktion übergeben wird:
KompilierenMarkierenSeparieren
!STRUCT TErg = x%, y%, z%
DIM Erg#, TErg

Die Funktion würde so aussehen:
KompilierenMarkierenSeparieren
!PROC meineFunktion
Parameters E#
<...>
E#.x% = ...
E#.y% = ..
E#.z% = ..
<...>

ENDPROC


Über return würde ich eventuell noch zurückggeben, ob die Funktion erfolgreich war. Im aufrufenden Programm sähe es dann etwa so aus:
KompilierenMarkierenSeparieren
!erfolg% = meineFunktion(Erg#)
x% = Erg#.x%
y% = Erg#.y%
z% = Erg#.z%

Mit der zweiten Lösung können auch komplexere Daten elegant zurückgeliefert werden. (Diese Lösung ist auch in anderen Programmiersprachen recht verbreitet.)

Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
15.09.2006  
 




Hubert
Binnewies
Danke für die wirklich erschöpfende Auskunft....

aber ich denke ich nehme eine weitere Möglichkeit...

Ich definiere mir entsprechende globale Variablen die ich in der Procedur immer erst leere und dann mit dem Rückgabewert versehe.

sooft wie ich die Proceduren brauche lohnt sich das Verfahren denke ich..

Aber nochmal Danke... Deine Antwort werde ich mit Sicherheit später mal brauchen.

Hubert
 
WinXP Prof, XProfan 9.1 Newbie

Ein kluger Kopf sagte mal:
"Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!"
15.09.2006  
 



Hab hier noch ein Beispiel, ohne jegliche globale Variable. Simuliertes byRef
KompilierenMarkierenSeparieren
Struct Long = l&

Proc Test1

    parameters a1&, a2&
    Declare B#
    Dim B#, Long
    B# = a1&
    B#.l& = 50  50 in c& von Test2 schreiben
    B# = a2&
    B#.l& = 100  100 in d& von Test2 schreiben
    Dispose B#  lokale Bereichsvariable wird nicht mehr gebraucht

EndProc

Proc Test2

    Declare c&, d&
    Test1 Addr(c&), Addr(d&)
    print "Wert von c& = " + Str$(c&) + "  d& = " + Str$(d&) + " in der Proc"

EndProc

Declare c&, d&
cls
Test2
Print
Print "Globales c& = " + Str$(c&) + "  Globales d& = " + Str$(d&) + " wurden nicht verändert!"
waitkey

Proc Test2 über gibt den Pointer von c& und d& an Proc Test1, welche dort 50 und 100 als Rückgabe einträgt. Wie man siehst, keine globalen Variablen und der Bereich wird auch gleich disposed

Hoffe mal, das kann jemand gebrauchen

// Nachtrag:
hab den Code noch etwas erweitert, damit man sieht, das es wirklich geht

Hier nochmal ohne Hilfsstructur, hab ich garnicht dran gedacht, das es in Profan auch so geht:
KompilierenMarkierenSeparieren
Proc Test1

    parameters a1&, a2&
    Declare B#
    Dim B#,4
    B# = a1&
    Long B#,0 = 50  50 in c& von Test2 schreiben
    B# = a2&
    Long B#,0 = 100  100 in d& von Test2 schreiben
    Dispose B#  lokale Bereichsvariable wird nicht mehr gebraucht

EndProc

Proc Test2

    Declare c&, d&
    Test1 Addr(c&), Addr(d&)
    print "Wert von c& = " + Str$(c&) + "  d& = " + Str$(d&) + " in der Proc"

EndProc

Declare c&, d&
c& = 1
d& = 1
cls
Test2
Print
Print "Globales c& = " + Str$(c&) + "  Globales d& = " + Str$(d&) + " wurden nicht verändert!"
waitkey

Ist vielleicht verständlicher
 
15.09.2006  
 



Weils so schön ist, noch die einfachste Variante (hab damit leider bisher zu wenig gemacht )
KompilierenMarkierenSeparieren
Proc Test1

    parameters a1&, a2&
    Long a1&,0 = 50
    Long a2&,0 = 100

EndProc

Proc Test2

    Declare c&, d&
    Test1 Addr(c&), Addr(d&)
    print "Wert von c& = " + Str$(c&) + "  d& = " + Str$(d&) + " in der Proc"

EndProc

Declare c&, d&
c& = 1
d& = 1
cls
Test2
Print
Print "Globales c& = " + Str$(c&) + "  Globales d& = " + Str$(d&) + " wurden nicht verändert!"
waitkey
 
15.09.2006  
 



Ähem - Du änderst doch nix weiter als den Wert von globalen Variablen - und das auch noch umständlich.
 
15.09.2006  
 



[quote:a6584bda33=iF]Ähem - Du änderst doch nix weiter als den Wert von globalen Variablen - und das auch noch umständlich. [/quote:a6584bda33]
Die Variablen in beiden Proc sind lokal, Proc Test1 ändert die Variablen von Test2, Gleichnamige Globale Variablen bleiben auch erhalten. Funktioniert so allerdings nicht mit Strings. Globale Variablen werden nicht geändert

Ich übergebe den Pointer und mache einen profanischen Poke
 
15.09.2006  
 



Ne quatsch - Du deklarierst zwei Globale - die änderst Du in der Proc - mehr nicht. Dein Code geht nicht ohne Globals die Du nutzt.

Oder stehe ich aufm Schlauch?
 
15.09.2006  
 



[quote:869f8d550b=iF]Ne quatsch - Du deklarierst zwei Globale - die änderst Du in der Proc - mehr nicht. Dein Code geht nicht ohne Globals die Du nutzt.

Oder stehe ich aufm Schlauch? [/quote:869f8d550b]
Bei mir gehts::
KompilierenMarkierenSeparieren
Proc Test1

    parameters a1&, a2&
    Long a1&,0 = 50
    Long a2&,0 = 100

EndProc

Proc Test2

    Declare c&, d&
    Test1 Addr(c&), Addr(d&)
    print "Wert von c& = " + Str$(c&) + "  d& = " + Str$(d&)

EndProc

Test2
waitkey

Hab die globalen Variablen ja nur zum Beweis dazugepackt, das diese nicht geändert werden, jetzt denkst gleich wieder verkehrt herum
 
15.09.2006  
 



Ach jetzt! Klar! Hab das Declare in der zweiten Proc übersehen!

Thomas will sagen, einfache die Adressen der Variablen an eine Proc übergeben, und die Variableninhalte per Long ändern.
 
15.09.2006  
 




Hubert
Binnewies
ööööööhmmmmmm.....

und wenn ich keine numerischen Werte sondern Strings habe??

(nicht schlecht die Lösung, kann ich gebrauchen)

Gruß Hubert
 
WinXP Prof, XProfan 9.1 Newbie

Ein kluger Kopf sagte mal:
"Nach dem derzeitigen Stand der Technik ist es unmöglich Programme zu schreiben, die fehlerfrei laufen!"
15.09.2006  
 




Rolf
Koch
Nur zur Erweiterung:
Seit Ewigkeiten schlummert unter eigene Codes folgenders auf meiner Seite
Mehr als einen Parameter aus einer Prozedur zurückliefern - Neu (19.03.2003)

Man sollte auch mal auf meiner Seite kucken *lol*
 
15.09.2006  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.136 Betrachtungen

Unbenanntvor 0 min.
Normann Strübli05.02.2023
H.Brill05.11.2022
RudiB.25.04.2021
Michael W.16.08.2017
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie