Prozedur soll Pointer zurückgeben

Anfängerfragen zum Programmieren mit PureBasic.
nalor
Beiträge: 10
Registriert: 29.06.2009 15:48

Prozedur soll Pointer zurückgeben

Beitrag von nalor »

Wenn eine Prozedur mit ReAllocateMemory einen Speicherbereich verändert, dann kann es ja sein, dass sich die Basisadresse verändert - deswegen ist es dann wohl notwendig die neue Basisadresse zurückzuliefern.

Das folgenden Beispiel scheint zu funktionieren - aber in der Prozedur wurde ja nicht festgelegt, welcher Variablentyp mit ProcedureReturn zurückgegeben werden soll. Ist das bei Pointern nicht notwendig oder funktioniert das eher durch Zufall? Und so etwas wie "Procedure.* xxxxxxx" gefällt dem Compiler sowieso nicht - also wie würde man es richtig machen?

Code: Alles auswählen

Procedure test(*mem)
	*mem2=ReAllocateMemory(*mem, 500000)
	ProcedureReturn *mem2
EndProcedure

*mem1=AllocateMemory(1000)
Debug *mem1
*mem1=test(*mem1)
Debug *mem1
Danke!
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: Prozedur soll Pointer zurückgeben

Beitrag von ts-soft »

Der Standard-Typ in PB ist Integer. Ein Pointer passt immer in ein Integer, deshalb ist alles korrekt so!
(Es sei denn, Du hast den Default-Typ per Define geändert!)

Gruß
Thomas

// leicht geändertes Beispiel, damit die Änderung auch sichtbar wird:

Code: Alles auswählen

Procedure test(*mem)
   *mem2=ReAllocateMemory(*mem, 500000)
   ProcedureReturn *mem2
EndProcedure

*mem1=AllocateMemory(1000)
Debug MemorySize(*mem1)
*mem1=test(*mem1)
Debug MemorySize(*mem1)
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
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: Prozedur soll Pointer zurückgeben

Beitrag von PMV »

PB-Hilfe hat geschrieben:Eine Prozedur kann wenn nötig eine Zahl oder einen String zurückliefern. Sie müssen in diesem Fall nach Procedure den Typ (.Typ) festlegen und das ProcedureReturn Schlüsselwort an einem beliebigen Punkt innerhalb der Prozedur aufrufen. Ein Aufruf von ProcedureReturn verlässt umgehend die Prozedur, auch wenn er innerhalb einer Schleife erfolgt.
ProcedureReturn kann nicht verwendet werden, um ein Array, eine Linked List oder eine Map Map zurückzuliefern, übergeben Sie zu diesem Zweck das Array, die Linked List bzw. die Map als Parameter an die Prozedur.

Code: Alles auswählen

Procedure.i test(*mem)
   *mem2=ReAllocateMemory(*mem, 500000)
   ProcedureReturn *mem2
EndProcedure

*mem1=AllocateMemory(1000)
Debug MemorySize(*mem1)
*mem1=test(*mem1)
Debug MemorySize(*mem1)
MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
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: Prozedur soll Pointer zurückgeben

Beitrag von ts-soft »

Der Returntyp muß nur bei String, Float oder Double angegeben werden, solange der Default-Typ nicht verändert wurde.
Ganzzahlen sollte man immer als Integer zurückgeben, auch wenn das Ergebnis in ein Byte, Word usw. passt!
Ausnahme Quad by 32-Bit Programmen.

Die Rückgabe eines Integer benötigt die wenigsten Anweisungen und ist am schnellsten ausgeführt. Das nutzen
z.B. eines Bytes als Rückgabewert (Procedure.b) spart keinerlei Speicher und verlangsamt (wenn auch kaum
bemerkbar) das Programm unnötig. In 99,9 % aller Fälle ist für die Rückgabe einer Ganzzahl (ausser siehe Quad) der
Integer die richtige Wahl!

Gruß
Thomas
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