Seite 1 von 2

Zeiger-Rückgabe aus Prozedur

Verfasst: 08.04.2007 13:34
von Rozek
Hallo!

Eine (vermutlich) typische Anfängerfrage: wie definiere ich (unter PureBasic 4.0) eine Procedure, die einen Zeiger zurückgibt?

Variablen lassen sich problemlos definieren, z.B.:

Code: Alles auswählen

  define *BytePtr.b
aber Prozeduren mögen den Stern vor "procedure" nicht:

Code: Alles auswählen

  *procedure.b
geht nicht durch den Compiler. Nun gelten Zeiger als äquivalent zu ".l" - dies stimmt aber wohl nur auf 32-bit Systemen. Wenn ich nun statt "*.b" (oder ähnlichem) stets ".l" schreibe, werde ich bei der Umstellung auf 64-bit (was vermutlich nicht mehr lange auf sich warten lassen wird) meinen gesamten Code danach durchforsten müssen, welches ".l" nun tatsächlich als "long" und welches als "*.b" gemeint war...

Gibt es einen besseren Weg?

Verfasst: 08.04.2007 13:50
von nco2k
einfach den pointer als result zurückgeben.

Code: Alles auswählen

Procedure MyAllocateMemory(Size)
  *Pointer = AllocateMemory(Size)
  ProcedureReturn *Pointer
EndProcedure

*Memory = MyAllocateMemory(1024)
If *Memory
  PokeS(*Memory, "Test")
  Debug PeekS(*Memory)
  FreeMemory(*Memory)
EndIf
bzw da AllocateMemory() sowieso einen pointer zurückliefert, kannst du es auch so schreiben:

Code: Alles auswählen

Procedure MyAllocateMemory(Size)
  ProcedureReturn AllocateMemory(Size)
EndProcedure
das *Pointer.b, *Pointer.l etc. fiasko kannst du dir sparen, da es sowieso ignoriert wird. auf einem 32bit OS wird ein pointer immer 4byte sein, egal was du dahinter schreibst. also wenn du *Pointer.q schreibst, wird der pointer trotzem als long behandelt, deswegen ist es sinnlos bei pointern einen datentyp anzugeben.

c ya,
nco2k

Verfasst: 08.04.2007 13:58
von Rozek
Danke für die schnelle Antwort!

Bedeutet

Code: Alles auswählen

  *Ptr.b
denn *nicht*, daß ich einen Zeiger auf ein Byte definiere?

Und: der Hilfe zufolge werden Prozeduren ohne expliziten Rückgabetyp implizit als ".l" definiert (was man aber wohl auch ändern kann, wenn ich mich recht erinnere) Handele ich mir damit nicht *wieder* das von mir genannte Problem ein?[/code][/list]

Verfasst: 08.04.2007 14:31
von nco2k
> Bedeutet

Code: Alles auswählen

 denn *nicht*, daß ich einen Zeiger auf ein Byte definiere?
der pointer selber ist trotzdem long, egal wohin er zeigt.

> Handele ich mir damit nicht *wieder* das von mir genannte Problem ein?
deswegen lässt du den datentyp auch bei prozeduren weg, welche ein pointer oder handle zurückliefern. wenn irgendwann eine 64bit version von pb draussen ist, wird dann quad der standardtyp sein, für handles und pointer und alles andere was du nicht manuell definiert hast.

c ya,
nco2k

Verfasst: 08.04.2007 15:00
von Rozek
nco2k hat geschrieben:> Bedeutet

Code: Alles auswählen

 denn *nicht*, daß ich einen Zeiger auf ein Byte definiere?
der pointer selber ist trotzdem long, egal wohin er zeigt.
[/quote]
Das darf und muß er auch - ich erhoffe mir von der Notation nur etwas zusätzliche Compiler-Unterstützung, bei Fehlererkennungen und Typ-Konvertierungen z.B. (genauer gesagt: ich hatte mir das erhofft...)

[quote="nco2k"]
> Handele ich mir damit nicht *wieder* das von mir genannte Problem ein?
deswegen lässt du den datentyp auch bei prozeduren weg, welche ein pointer oder handle zurückliefern. wenn irgendwann eine 64bit version von pb draussen ist, wird dann quad der standardtyp sein, für handles und pointer und alles andere was du nicht manuell definiert hast.
[/quote]

Da ist natürlich was dran - jetzt muß ich nur noch herausfinden, wie man Prozeduren definiert, die kein Ergebnis zurückliefern (void)

Verfasst: 08.04.2007 15:02
von Kaeru Gaman
> jetzt muß ich nur noch herausfinden, wie man Prozeduren definiert, die kein Ergebnis zurückliefern (void)

indem man kein ProcedureReturn verwendet... :mrgreen:

Verfasst: 08.04.2007 15:03
von edel
void gibt es nicht.

KG , wobei die Procedure auch mit oder ohne ProcedureReturn 0 liefert.

Verfasst: 08.04.2007 15:08
von Kaeru Gaman
ja is klar. es wird kein fehler produziert, wenn man den wert zuweist.

welches register war denn das nochmal, wo der rückgabewert drinsteht?
man kann doch irgendwie mit nem MOV nen ProcedureReturn ersetzen.....

Verfasst: 08.04.2007 15:11
von edel
eax , ein simples Mov ersetzt allerdings kein return ;-)

Verfasst: 08.04.2007 18:22
von AND51
> jetzt muß ich nur noch herausfinden, wie man Prozeduren definiert, die kein Ergebnis zurückliefern (void)
Man kann auch ProcedureReturn OHNE einen Wert dahiner verwenden. Anscheind wird dann immer ein zufälliger Wert zurückgegeben (der, der wegen der letzten Berechnung noch in den Registern steckt).

Ich meine, das mal in der Hilfe gelesen zu haben, finde es aber gerade nicht. Falls ich es in Kürze noch finde, poste ich es hier.

Testet es mal!

Code: Alles auswählen

Procedure avoid()
	Debug 5+7
	ProcedureReturn 
EndProcedure

Debug avoid()