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 :wink:

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 :mrgreen:

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 :mrgreen:
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 :wink:

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.