Zeiger-Rückgabe aus Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Zeiger-Rückgabe aus Prozedur

Beitrag 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?
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag 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]
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag 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)
Mit freundlichen Grüßen,

Andreas Rozek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

void gibt es nicht.

KG , wobei die Procedure auch mit oder ohne ProcedureReturn 0 liefert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

eax , ein simples Mov ersetzt allerdings kein return ;-)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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()
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten