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 :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
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 :wink:
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 :mrgreen:

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 :mrgreen:[/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 :mrgreen:

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!