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!

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.