Seite 1 von 1

Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 00:49
von Delle
Hallo,

wie kann man aus einer Prozedure heraus mehrere Werte zurückgeben?

Global Werte nehmen?

Oder mit Trenner alles in einen String schreiben, zurückgegeben und dann auswerten?

Danke,
Delle

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 00:57
von STARGÅTE
Wurde schon mehrfach im Forum gezeigt:

Direkt geht das nicht, aber du kannst als ersten Parameter einen Zeiger zu einer Struktur übergeben in die das Resultat geschrieben werden soll:

Code: Alles auswählen

Structure Result
  Integer.i
  String.s
  Float.f
EndStructure

Procedure Beispiel(*Result.Result, Parameter.i)
  *Result\Float = Parameter * 0.01
  *Result\String = "Zahl "+Str(Parameter)
  *Result\Integer = Parameter * 100
EndProcedure

Define Result.Result

Beispiel(@Result, 7)

Debug Result\Float
Debug Result\String
Debug Result\Integer

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 01:00
von ts-soft

Code: Alles auswählen

EnableExplicit

Procedure bla(*a.Integer, *b.Integer, *c)
  Define *strRes.String = @*c
  *a\i = 100
  *b\i = 200
  PokeS(*c, "300")
EndProcedure

Define a, b, c.s = "" ; wichtig: den String einen Initialisieren!!

bla(@a, @b, @c)
Debug a
Debug b
Debug c

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 10:56
von matbal
@ts-soft

Warum funktioniert auch sie Rückgabe des Strings in deiner Procedure? Ich habe die Funktionsweise der Stringverwaltung in PureBasic noch nicht richtig durchschaut...
Zwei Fragen speziell zu deine Procedure:

1. Was bewirkt die esten Zeile in der Procedure?

Code: Alles auswählen

Define *strRes.String = @*c
2. Warum kann man den String poken? Es wurde doch nirgends Speicher reserviert. Oder übersehe ich etwas?

Code: Alles auswählen

PokeS(*c, "300")

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 11:16
von ts-soft
matbal hat geschrieben:1. Was bewirkt die esten Zeile in der Procedure?

Code: Alles auswählen

Define *strRes.String = @*c
Die ist besonders wichtig :mrgreen: , einfach ignorieren, gehört nicht dazu.
matbal hat geschrieben: 2. Warum kann man den String poken? Es wurde doch nirgends Speicher reserviert. Oder übersehe ich etwas?

Code: Alles auswählen

PokeS(*c, "300")
Okay, das ist nicht in Ordnung so.

Code: Alles auswählen

EnableExplicit

Procedure bla(*a.Integer, *b.Integer, *c.String)
  *a\i = 100
  *b\i = 200
  *c\s = "300"
EndProcedure

Define a, b, c.String

bla(@a, @b, @c)
Debug a
Debug b
Debug c\s
So gibt es keine Probleme :wink:

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 12:17
von matbal
Probleme hatte ich mit deinem ersten Code auch nicht (unter WinXP).
Ich hatte mich eben nur gewundert, daß es so funktioniert hat....

Das würde aber bedeuten, daß schon der Leerstring mehr Speicher bekommen hat, als er braucht.

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 12:48
von ts-soft
matbal hat geschrieben:Probleme hatte ich mit deinem ersten Code auch nicht (unter WinXP).
Dann füge mal:

Code: Alles auswählen

PurifierGranularity(1,1,1,1)
ein und schalte den Purifier an, dann siehste, das der erste
Code nicht korrekt war :wink:

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 13:27
von Falko
@ts-soft
Schönes Beispiel mit den zwei (in Pb eigenen) Structuren direkt in der Procedure.
Zuerst war ich irritiert, aber nun habe auch ich das auch verstanden,
nachdem du den zweiten Code rein gestellt hast. :mrgreen: :allright:

Gruß,
Falko

Re: Mehrere Rückgabewerte für Prozedure?

Verfasst: 02.03.2012 14:27
von ts-soft
Ich verwende selber eher Strukturen, wie STARGÅTEs Beispiel zeigt, kann man weniger Fehler mit Strings machen :wink:
Aber wegen der Komplettnes ...