Seite 1 von 3

Strukturie Prozedurrückgabe bei PureBasic

Verfasst: 24.07.2006 14:05
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.

Verfasst: 12.05.2008 11:01
von BlueHoschi
Hoffe Du bist noch an Board...

Danke für den Beitrag (nach so langer Zeit endlich Dank), kann ich gut gebrauchen!!

Verfasst: 12.05.2008 15:20
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.

Verfasst: 12.05.2008 15:29
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...

Verfasst: 12.05.2008 15:40
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

Verfasst: 12.05.2008 15:44
von milan1612
Ehm, wenn du mir erklärst was genau ich mir da anschauen soll, dann gern :wink:

Verfasst: 12.05.2008 15:45
von BlueHoschi
Hab´ am Ende einige Fragen dazu, dachte vielleicht kannst Du mir helfen?? (letzte Seite)

Verfasst: 12.05.2008 15:54
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...

Verfasst: 12.05.2008 15:58
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:

Verfasst: 12.05.2008 16:16
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: