Procedure mit 2 Rückgabewerten ?

Anfängerfragen zum Programmieren mit PureBasic.
brandelh
Beiträge: 18
Registriert: 28.03.2005 21:30
Wohnort: Germersheim
Kontaktdaten:

Procedure mit 2 Rückgabewerten ?

Beitrag 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
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Re: Procedure mit 2 Rückgabewerten ?

Beitrag 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:
Zuletzt geändert von benpicco am 18.03.2006 23:48, insgesamt 2-mal geändert.
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
brandelh
Beiträge: 18
Registriert: 28.03.2005 21:30
Wohnort: Germersheim
Kontaktdaten:

Beitrag von brandelh »

Hallo,

danke für die Info, das werde ich so @machen, dann entspricht es dem Aufruf von Clipper aus ;-)

Tschüß
Hubert
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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 
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Weil das nicht per Reference ist und bei einer DLL nicht funktionieren würde.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten