Mehrere Rückgabewerte für Prozedure?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Mehrere Rückgabewerte für Prozedure?

Beitrag 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
PB 6.21 | Win 11
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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
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
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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")
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

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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:
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
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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.
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

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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:
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
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
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

Re: Mehrere Rückgabewerte für Prozedure?

Beitrag 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 ...
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