Seite 1 von 1
Prozedur soll Pointer zurückgeben
Verfasst: 27.10.2010 13:27
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!
Re: Prozedur soll Pointer zurückgeben
Verfasst: 27.10.2010 14:03
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)
Re: Prozedur soll Pointer zurückgeben
Verfasst: 27.10.2010 15:35
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
Re: Prozedur soll Pointer zurückgeben
Verfasst: 27.10.2010 16:02
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