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:

Re: Pointer in Strukturen ?

Beitrag von Thorsten1867 »

In meinem obigen Codebeispiel (XML) weise ich dem Pointer *Schueler eine neue Speicheradresse (Node) zu.
Enthält *Schüler nach dem Aufruf der Prozedur den neuen Node (Speicheradresse) oder nicht???
Diese Pointer machen mich echt fertig! :wink:
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

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 »

Nein, das tut er nicht. Also der übergebene *Schueler ändert sich nicht. Allerdings bekommst du den neuen Wert als Rückgabewert. Oder du machst es so:

Code: Alles auswählen

Procedure XMLSchuelerNode(*MainNode, Sid.l, *pSchueler.Integer)
	Protected *Schueler
	If *MainNode
		*Schueler = XMLNodeFromPath(*MainNode, "Schueler")
		While *Schueler <> 0
			If GetXMLAttribute(*Schueler, "sid") = Str(Sid)
				*pSchueler\i = *Schueler
				ProcedureReturn #True
			EndIf
			*Schueler = NextXMLNode(*Schueler)
		Wend
	EndIf
	ProcedureReturn #False
EndProcedure

;Der Aufruf ist dann wie folgt:
Define *Schueler = 0 ;<--- Inhalt soll sich ändern und ist aktuell 0
If XMLSchuelerNode(*MainNode, 123, @*Schueler)	;Wichtig ist das @ vor *Schueler, damit wir den Pointer zum Pointerinhalt kriegen
	;Der Schüler wurde gefunden und der Wert von *Schueler geändert:
	Debug *Schueler
Else
	;Der Schüeler wurde nicht gefunden und *Schueler ist immer noch 0
	Debug *Schueler
EndIf
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 »

NicTheQuick hat natürlich recht, aber es spricht nichts dagegen *Schueler als ProcedureReturn zurückzugeben.
In diesem Fall sicher das einfachste.
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 »

ts-soft hat geschrieben:NicTheQuick hat natürlich recht, aber es spricht nichts dagegen *Schueler als ProcedureReturn zurückzugeben.
In diesem Fall sicher das einfachste.
Das glaube ich inzwischen auch.
Aber immerhin war das Ganze recht aufschlussreich und ich verstehen endlich was es mit "@*Schueler" auf sich hat. Danke für die Erklärung. Jetzt bin ich wieder ein bisschen schlauer. <)
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 »

Wichtig ist bei so einem ProcedureReturn eines Pointers, das dieser "Gültig" bleibt.
Dies ist bei Adressen zu lokalen Variablen nicht gegeben, aber bei Memory, XML usw.
bleibt der Pointer ja gültig, bis diese freigegeben wurden.

Beispiel:

Code: Alles auswählen

Procedure a()
  Protected c = 1000
  ProcedureReturn @c
EndProcedure

Procedure b()
  Static c = 1000
  ProcedureReturn @c
EndProcedure

Debug PeekI(a())
Debug PeekI(b())
a() gibt entweder 0 oder was undefiniertes (sehr gefährlich)
b() funktioniert
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
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Pointer in Strukturen ?

Beitrag von DrShrek »

Es könnten auch Pointer auf Strukturen zurückgegeben werden.
Geht aktuell nur nicht, weil hier ein Syntax Erweiterung noch fehlt bzw. der Syntaxcheck angepasst/entfernt werden muss.

//Edit:
Ergänzung: Geht natürlich schon jetzt: Pointer auf Strukturen zurückzugeben.
Declare kann nur nicht damit umgehen. Hier fehlt eine Erweiterung der Syntax.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Antworten