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 :wink:
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