Seite 2 von 3
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 16:51
von Thorsten1867
ts-soft hat geschrieben:Es ist auch nicht so üblich, pointer oder strukturen zurück zu geben
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
Das klingt doch gleich viel besser.
Wusste doch, dass es einen Trick geben muss, soetwas "sauber" zu programmieren.

Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 16:55
von ts-soft
Ist doch kein Trick. Das ist der Sinn von ByRef bzw. Pointern. Direktes verändern der Werte.
Rückgabe ist dann meist nur #True oder #False.
Man sollte dabei immer die Gültigkeit bzw. Existenz des Speichers berücksichtigen!
Das erzeugen in einer anderen Procedure und zurückgeben, würde normal nicht gehen,
es sei denn, es wurde Static verwendet, was man aber eher meiden sollte.
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:01
von Thorsten1867
ts-soft hat geschrieben:Ist doch kein Trick. Das ist der Sinn von ByRef bzw. Pointern. Direktes verändern der Werte.
Rückgabe ist dann meist nur #True oder #False.
Irgendetwas mache ich wohl schon wieder falsch:
Code: Alles auswählen
test1.s = "Test 1"
test2.s = "Test 2"
Procedure Pointer(*Zeiger)
*Zeiger = @test2
EndProcedure
*Test = @test1
Debug PeekS(*Test)
Pointer(*Test)
Debug PeekS(*Test)
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:09
von ts-soft
Strings erfordern meist eine Sonderbehandlung
Hier ein funktionierendes Beispiel:
Code: Alles auswählen
EnableExplicit
Procedure Pointer(*zeiger.String)
Debug *zeiger\s
*zeiger\s = "geänderter String"
EndProcedure
Define.string test1, test2
test1\s = "Test 1"
test2\s = "Test 2"
Pointer(@test1)
Debug test1\s
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:15
von Thorsten1867
Sorry, war ein ungünstiger Democode.
Die Pointer sind eigentlich XML-Nodes für die es meines Wissens keine Struktur als Typ gibt.
Wie kann ich hier ein ProcedureReturn umgehen?
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 ?
Verfasst: 21.01.2013 17:27
von ts-soft
Code: Alles auswählen
Procedure XMLSchuelerNode(*MainNode, Sid.l, *Schueler)
If *MainNode
*Schueler = XMLNodeFromPath(*MainNode, "Schueler")
While *Schueler <> 0
If GetXMLAttribute(*Schueler, "sid") = Str(Sid)
ProcedureReturn *Schueler
EndIf
*Schueler = NextXMLNode(*Schueler)
Wend
EndIf
EndProcedure
Damit wäre dann *Schueler auch gleich deklariert, was Du wohl nicht unbedingt machst

Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:37
von Thorsten1867
Damit wäre dann *Schueler auch gleich deklariert, was Du wohl nicht unbedingt machst

[/quote]
Das wäre schon ok.
Verstehe ich das also richtig? Wenn ich einen Pointer an eine Procedure übergebe und diesen dort ändere, ist er auch in der "Elternprozedur" geändert.
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:42
von ts-soft
So sieht es aus. Das ist der Sinn der Pointer.
Ich glaube Du hast meinen Nachtrag hier:
http://www.purebasic.fr/german/viewtopi ... 16#p308216
übersehen, da haben wir uns überschnitten.
Das mit dem deklarieren meinte ich schon Ernst, EnableExplicit gehört in jedem Source an erster Stelle.
Codes ohne dieses untersuche ich normalerweise gar nicht mehr nach Fehlern, die sind es nicht Wert
bereinigt zu werden

Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:49
von Thorsten1867
Vielen Dank für die Erläuterung.
Ich muss jetzt erstmal meinen Code überprüfen, da ich womöglich unabsichtlich in Prozeduren Pointer geändert haben könnte.
Re: Pointer in Strukturen ?
Verfasst: 21.01.2013 17:52
von ts-soft
Der Pointer ändert sich nicht. Das war wohl falsch. Nur der Inhalte an dieser Speicherstelle kann geändert werden!