Seite 1 von 3
Pointer in Strukturen ?
Verfasst: 20.01.2013 16:48
von Thorsten1867
Irgendwie finde ich keine Lösung für mein Problem.
Neben anderen Daten muss ich auch einen Pointer auf einen XML-Node speichern. Wie bekomme ich das Code-Beispiel zum Laufen?
Code: Alles auswählen
Structure XMLStructure
id.s
text.s
*Node
EndStructure
NewList XmlTB.XMLStructure()
test$ = "Test"
AddElement(XmlTB())
XmlTB()\*Node = @test$
Debug XmlTB()\*Node
Debug PeekS(XmlTB()\*Node)
Re: Pointer in Strukturen ?
Verfasst: 20.01.2013 16:55
von DarkDragon
Code: Alles auswählen
Structure XMLStructure
id.s
text.s
*Node
EndStructure
NewList XmlTB.XMLStructure()
test$ = "Test"
AddElement(XmlTB())
XmlTB()\Node = @test$
Debug XmlTB()\Node
Debug PeekS(XmlTB()\Node)
Nach einem \ benötigt man keinen * mehr. Das ist auch eine alte, inkonsistente Altlast von PureBasic.
Re: Pointer in Strukturen ?
Verfasst: 20.01.2013 17:14
von Thorsten1867
Tausend Dank! Da hätte ich noch ewig rumprobieren können.
Re: Pointer in Strukturen & Prozeduren?
Verfasst: 21.01.2013 15:49
von Thorsten1867
Gibt es für Definition eines Pointers als Rückgabewert einer Prozedur eine ähnlich einfache Lösung?
Den Typ als Long zu definieren, wäre ja nicht wirklich korrekt.
Code: Alles auswählen
Procedure XMLSchuelerNode(*MainNode, Sid.l)
If *MainNode
*Schueler = XMLNodeFromPath(*MainNode, "Schueler")
While *Schueler <> 0
If GetXMLAttribute(*Schueler, "sid") = Str(Sid)
ProcedureReturn *Schueler
EndIf
*Schueler = NextXMLNode(*Schueler)
Wend
EndIf
EndProcedure
Re: Pointer in Strukturen & Prozeduren?
Verfasst: 21.01.2013 16:07
von ts-soft
Thorsten1867 hat geschrieben:Den Typ als Long zu definieren, wäre ja nicht wirklich korrekt.
Stimmt, Integer wäre korrekt!
Re: Pointer in Strukturen & Prozeduren?
Verfasst: 21.01.2013 16:18
von Thorsten1867
ts-soft hat geschrieben:Stimmt, Integer wäre korrekt!
Der PB 5.1 - Diskussion entnehme ich, dass Pointern eigentlich überhaupt kein nativer Typ zugewiesen werden darf.
Wie bringe ich also der Prozedur bei, dass der Rückgabewert ein Pointer ist?
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 16:23
von ts-soft
Garnicht, du gibts einen Integer zurück!
Code: Alles auswählen
Procedure.i bla()
Protected *mem = AllocateMemory(100)
ProcedureReturn *mem
EndProcedure
Define *mymem = bla()
Debug MemorySize(*mymem)
FreeMemory(*mymem)
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 16:26
von Thorsten1867
Das scheint mir zwar nicht unbedingt logisch, aber ich werde es dann wohl so machen. Danke!
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 16:31
von ts-soft
Es ist auch nicht so üblich, pointer oder strukturen zurück zu geben
Meist eher so:
Code: Alles auswählen
Procedure bla(*a.RECT)
*a\bottom = 100
*a\top = 200
EndProcedure
Define test.RECT
bla(@test)
Debug test\bottom
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 16:37
von NicTheQuick
Das logische daran ist eigentlich nur, dass ein Integer (.i) immer genau so groß ist wie ein Pointer, sich also an das jeweilige System anpasst, für das kompiliert wird.
Richtige Pointer als Rückgabewert sind in PB nicht vorgesehen, aber was noch nicht ist, kann ja noch werden.
Besonders cool fänd' ich sowas in der Art:
Code: Alles auswählen
Procedure.Integer *HerDamit()
Static da.i
ProcedureReturn @da ;Hier wird ein Pointer zur Static Variable da zurück gegeben
EndProcedure
*HerDamit()\i = 5 ;Hier wird somit der Inhalt von da.i geändert
Debug *HerDamit()\i ;Und hier nochmal ausgegeben
Oder zumindest sowas hier.
Code: Alles auswählen
Procedure.Integer HerDamit()
Protected da.Integer ;Static ist hier nicht notwendig
da\i = 6
ProcedureReturn da ;Hier wird die Variable samt Strukturinhalt kopiert und die Kopie zurück gegeben
EndProcedure
Define.Integer yeah.Integer
yeah = HerDamit() ;Die Kopie wird dann yeah.Integer zugewiesen
Debug yeah\i ;und der dahinter liegende Wert ausgegeben