Seite 3 von 3

Re: Pointer in Strukturen ?

Verfasst: 21.01.2013 17:59
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:

Re: Pointer in Strukturen ?

Verfasst: 21.01.2013 18:09
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

Re: Pointer in Strukturen ?

Verfasst: 21.01.2013 18:15
von ts-soft
NicTheQuick hat natürlich recht, aber es spricht nichts dagegen *Schueler als ProcedureReturn zurückzugeben.
In diesem Fall sicher das einfachste.

Re: Pointer in Strukturen ?

Verfasst: 21.01.2013 18:21
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. <)

Re: Pointer in Strukturen ?

Verfasst: 21.01.2013 18:28
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

Re: Pointer in Strukturen ?

Verfasst: 21.01.2013 20:02
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.