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 »

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. <)
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 »

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.
Zuletzt geändert von ts-soft am 21.01.2013 17:02, insgesamt 1-mal geändert.
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: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)
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 »

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
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 »

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
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 »

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:
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 »

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.
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 »

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:
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 »

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.
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 »

Der Pointer ändert sich nicht. Das war wohl falsch. Nur der Inhalte an dieser Speicherstelle kann geändert werden!
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
Antworten