Strukturie Prozedurrückgabe bei PureBasic

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Strukturie Prozedurrückgabe bei PureBasic

Beitrag von Olaf »

Standardmäßig wird bei PureBasic die Rückgabe von strukturierten Variablen aus Prozeduren nicht unterstützt.
Es gibt jedoch unter Verwendung von Pointern einen sehr einfachen Umweg, um dies zu tun.
Bei der Methode mit den Pointern ist es dann auch möglich, mehrere Rückgaben aus einer Prozedur zu machen.
Der Vorteil einer strukturierten Werte-Rückgabe mit Pointern gegenüber der
Verwendung von globalen Variablen, deren Werte während der Prozedur geändert würden, besteht darin, dass die Rückgabe auch in verschiedene Variablen (Prozeduraufruf) möglich ist und nicht nur in "die" globale Variable, die in der Prozedur vorkommen müsste, und dass die Variablen, die die Werte erhalten sollen nicht global sein müssen.

Uff, das war ein Satz !!! :wink:

Code für die Rückgabe in eine Variable:

Code: Alles auswählen

Structure ab
  a.l
  b.d
EndStructure

Procedure SetValue(*Pointer_to_a_structured_Variable.ab) ;WICHTIG:Der Pointer muss die selbe Struktur haben wie die Zielvariable
  ;Eigener Prozedurcode:.....
  ;...
  ;...
  With *Pointer_to_a_structured_Variable
    ;Beispiel:Rückgabewerte:1,2
    \a=1
    \b=2
  EndWith
  ProcedureReturn ;zum evtl.Verlassen der Prozedur und zur evtl.Übergabe eines Exitcodes
EndProcedure
Aufruf der Prozedur:

Code: Alles auswählen

;Beispiel:
SetValue(@Variablenname.ab)  ;Die Variable "Variablenname.ab" wird nun die Werte erhalten.
Um Werte in weitere Variablen zurückzugeben, müssen lediglich neue Pointer in die
Prozedurargumente eingefügt werden.
PB 4.xx (Windows & Linux & Mac OS X)
Treffen sich 2 Kurven in der Unendlichkeit. Sagt die eine zur anderen: "Hau ab aus meinem Definitionsbereich oder ich leite dich ab!"
Darauf die andere: "Mach nur! Ich bin die e-Funktion." :lol:
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Hoffe Du bist noch an Board...

Danke für den Beitrag (nach so langer Zeit endlich Dank), kann ich gut gebrauchen!!
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
Bisonte
Beiträge: 2470
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Auch nicht verkehrt...

Ich behelfe mich mit einer Struktur

Code: Alles auswählen

Structure Parameter
String1.s
String2.s
Zahl1.l
...usw
EndStructure

Global Param.Parameter

Bei Prozeduren mit mehreren Rückgaben muss man natürlich die Struktur
löschen. Aber es läuft ohne Pointer .... so als NonPointer Fetischist ;)

Klappt eigentlich superb.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Also ich löse das Problem bei strukturierten Rückgabewerten immer so...

Code: Alles auswählen

Structure Struct
  X.l
  Y.l
EndStructure

Procedure ReturnProc()
  *id.Struct = AllocateMemory(SizeOf(Struct))
  *id\X = 5
  *id\Y = 10
  ProcedureReturn *id
EndProcedure

*ret.Struct = ReturnProc()
Debug *ret\X
Debug *ret\Y

FreeMemory(*ret)
...anstatt vor dem Auruf eine Variable zu deklarieren und deren Addresse mit zu übergeben.
Aber das ist wahrscheinlich Geschmacksache...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

@Einstein äh.. milan,

das gefällt mir im Moment am besten.
Könntest Du Dir vielleicht auch mal folgenden Thread ansehen?
http://www.purebasic.fr/german/viewtopic.php?t=1993
Sag mir was Du dazu meinst. Wäre nett.

@all,

manchmal nutzt es doch was einen Thread wieder noch oben zu holen
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Ehm, wenn du mir erklärst was genau ich mir da anschauen soll, dann gern :wink:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

Hab´ am Ende einige Fragen dazu, dachte vielleicht kannst Du mir helfen?? (letzte Seite)
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Stefan verwendet hier das DirectX Interface das die PB Befehle intern verwenden.
(darum findest du auch in der MSDN nichts, schau in der DirectX Doku nach)
EDIT: Ich seh grad, Thomas (ts-soft) hat dir den Link in den obigen Thread gepostet

Interfaces sind in der PB Hilfe erklärt, allerdings ist das ein recht komplexes Thema
das man bei der Programmierung mit Purebasic sehr selten braucht...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
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 »

BlueHoschi hat geschrieben: wo kommt "GetDeviceState" her?
http://msdn.microsoft.com/de-de/library/bb205968.aspx

Und damit Du einfacher suchen kannst:
http://www.purebasic.fr/german/viewtopi ... 874#194874

// edit
habs mal nach hier gepackt, sollte hier landen :mrgreen:
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
BlueHoschi
Beiträge: 97
Registriert: 02.10.2007 07:19

Beitrag von BlueHoschi »

@milan,TS
Danke erstmal, macht einen verrückt wenn man sowas nicht findet.
Hab´ auch gar nicht gewußt das man DirectX so direkt ansprechen kann, aber fast schon logisch wenn´s mit API geht.

@TS
bei dem PSDK-Launcher bekomme ich nur ein leeres Bild, was muß ich jetzt tun (bitte Fremder nimmst Du mich an die Hand und bringst mich zu Mami?). Also vielleicht mal ´ne Erklärung für Dummies... :freak:
Wer Dir Steine in den Weg legt, pflastert den vielleicht.

PB 5.21, Win 7 64 bit
Antworten