Seite 1 von 2
Procedure mit 2 Rückgabewerten ?
Verfasst: 18.03.2006 23:24
von brandelh
Hallo,
ja ich weiß was ich will, und hoffe ich kann es beschreiben:
Code: Alles auswählen
Procedure.s HoleText(Paramter1,Paramter2, nError )
Protected cTxt.s
...
if EinFehlerIstPassiert
nError = 1
cTxt = ""
else
nError = 0
cTxt = "Ergebnistext"
endif
...
ProcedureReturn cTxt
Endprocedure
cString = HoleText(x,y,nError)
if nError
MessageRequester(Titel$, Text$, [, Flags])
endif
wie bekomme ich die Änderung der Variablen nError im aufrufenden Programm mit ?
Bei PowerBasic ist die Änderung der Standard, bei Xbase++ etc. würde ich per Referenz (@nError) übergeben, aber hier bringt das alles nichts ?
Ist das überhaupt möglich ?
Tschüß
Hubert
Re: Procedure mit 2 Rückgabewerten ?
Verfasst: 18.03.2006 23:45
von benpicco
brandelh hat geschrieben:. würde ich per Referenz (@nError) übergeben, aber hier bringt das alles nichts ?
Naja, bei PureBasic ist gibt das @ den Pointer zurück, und wenn du den übergibst bringt es sehr wohl was
Code: Alles auswählen
Procedure.s HoleText(Paramter1,Paramter2, pError )
Protected cTxt.s
If Paramter1=Paramter2
PokeB(pError,1) ;wir schreiben direckt im speicher rum
cTxt = ""
Else
PokeB(pError,0)
cTxt = "Ergebnistext"
EndIf
ProcedureReturn cTxt
EndProcedure
x=0
y=0
nError.b ;wen´s was anderes werden soll muss das auch hinter poke stehen, z.b. PokeW
cString.s = HoleText(x,y,@nError) ;Pointerübergabe
If nError
MessageRequester("Error","Variablen sind gleich")
EndIf
edit: Juhu, ich war scheller

Verfasst: 18.03.2006 23:45
von ts-soft
Recht simple:
Code: Alles auswählen
Procedure.s HoleText(Para1, Para2, *nError)
Protected cTxt.s
If Para1 < 100 ; Fehler Simulieren
PokeL(*nError, 1)
EndIf
ProcedureReturn cTxt
EndProcedure
Debug HoleText(99, 0, @nError)
Debug nError
Jetzt wird die Adresse von nError übergeben (ByRef) und die Procedure
schreibt direkt in die Adresse, per Poke
// Nachtrag: 7 sek. zu langsam
Aber das Pointerzeichen ist hier eigentlich sinnvoll, aber nicht
unbedingt erforderlich!
Verfasst: 19.03.2006 00:11
von brandelh
Hallo,
danke für die Info, das werde ich so @machen, dann entspricht es dem Aufruf von Clipper aus
Tschüß
Hubert
Verfasst: 19.03.2006 00:40
von Deeem2031
Warum nich so? Ich finde so sieht es besser aus, als mit PokeL()
Code: Alles auswählen
Procedure.s HoleText(Para1, Para2, *nError.Long)
Protected cTxt.s
If Para1 < 100 ; Fehler Simulieren
*nError\l = 1
EndIf
ProcedureReturn cTxt
EndProcedure
Debug HoleText(99, 0, @nError)
Debug nError
Verfasst: 19.03.2006 00:56
von ts-soft
>> Warum nich so? Ich finde so sieht es besser aus, als mit PokeL()
Die anderen Antworten sind aber etwas Anfängerfreundlicher. Ansonsten
haste Recht

Verfasst: 19.03.2006 01:27
von Macros
Warum nicht einfach shared?
Code: Alles auswählen
Procedure.s HoleText(Paramter1,Paramter2, nError )
Protected cTxt.s
shared nError
...
if EinFehlerIstPassiert
nError = 1
cTxt = ""
else
nError = 0
cTxt = "Ergebnistext"
endif
...
ProcedureReturn cTxt
Endprocedure
cString = HoleText(x,y,nError)
if nError
MessageRequester(Titel$, Text$, [, Flags])
endif
Verfasst: 19.03.2006 01:33
von ts-soft
Weil das nicht per Reference ist und bei einer DLL nicht funktionieren würde.
Verfasst: 19.03.2006 01:38
von Macros
Eine Dll ist es ja nicht,
aber erklärst du mir bitte, was du mit
per Reference
meinst, ich kenne die Bedeutung nicht.
Verfasst: 19.03.2006 01:42
von ts-soft
es gibt ByVal = der Wert wird direkt übergeben an die Funktion
und ByRef = die Adresse (Pointer) wird übergeben, wo der Wert steht, oder der Rückgabewert rein soll.
Das ist jetzt eine VB-Beschreibung, die Namen können in anderen Sprachen abweichen.