Pointer in Strukturen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Pointer in Strukturen ?

Beitrag 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)
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Pointer in Strukturen ?

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Pointer in Strukturen ?

Beitrag von Thorsten1867 »

Tausend Dank! Da hätte ich noch ewig rumprobieren können.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Pointer in Strukturen & Prozeduren?

Beitrag 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
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
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: Pointer in Strukturen & Prozeduren?

Beitrag von ts-soft »

Thorsten1867 hat geschrieben:Den Typ als Long zu definieren, wäre ja nicht wirklich korrekt.
Stimmt, Integer wäre korrekt!
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
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Pointer in Strukturen & Prozeduren?

Beitrag 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?
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
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: Pointer in Strukturen ?

Beitrag 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)
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
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Pointer in Strukturen ?

Beitrag von Thorsten1867 »

Das scheint mir zwar nicht unbedingt logisch, aber ich werde es dann wohl so machen. Danke!
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
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: Pointer in Strukturen ?

Beitrag 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
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
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Pointer in Strukturen ?

Beitrag 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
Antworten