Pointer auf strukturierte LL übergeben

Anfängerfragen zum Programmieren mit PureBasic.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Pointer auf strukturierte LL übergeben

Beitrag von teamO »

Hi,

gibt es in PB eine Möglichkeit Prozeduren einen Pointer auf eine strukturierte Linked List zu übergeben?

Ich hab schon ein bisschen rum probiert, hatte aber bis jetzt nur teilweise erfolg:

Code: Alles auswählen

Structure test
  x.b
  y.b
EndStructure

Procedure listTestStruct(List *a1.test())
  ForEach *a1()
    i+1
    Debug *a1()\x
  Next
EndProcedure

Procedure listTest(List *a1.b())
  ForEach *a1()
    i+1
    Debug *a1()
  Next
EndProcedure

NewList a1.test()
NewList a2.b()

For i=0 To 5
  AddElement(a1())
  a1()\x=i
  a1()\y=i
Next

For i=0 To 5
  AddElement(a2())
  a2()=i
Next

listTestStruct(@a1())
listTest(@a2())
während listTest() wie erhofft funktioniert kommt es bei listTestStruct() zu einem Lauzeitfehler:
der pointer *a1 ist "null"

Kann PB das nicht, oder bin ich nur noch nicht draufgekommen, wies geht?


PS: ich nutze PB 4.3
PPS: mein erster Beitrag in diesem Forum
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Pointer auf strukturierte LL übergeben

Beitrag von Josh »

soweit ich weiß, kannst du eine list an die procedur übergeben, aber keinen pointer darauf.

schau mal da:

http://www.purebasic.fr/german/viewtopi ... =3&t=21959
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 auf strukturierte LL übergeben

Beitrag von ts-soft »

So wie ich das sehe, machen die Pointer in dem Beispiel gar keinen Sinn. Einfach
weglassen und alles wird schön.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Pointer auf strukturierte LL übergeben

Beitrag von Josh »

wenn du allerdings ganz normal eine list mit struktur übergeben willst, dann ist das kein problem:

Code: Alles auswählen

Structure test
  x.b
  y.b
EndStructure

Procedure listTestStruct(List a1.test())
  ForEach a1()
    Debug Str(a1()\x) + " " + Str(a1()\y)
  Next
EndProcedure

NewList a1.test()

For i=7 To 10
  AddElement(a1())
  a1()\x=i
  a1()\y=i*2
Next

listTestStruct(@a1())
teamO hat geschrieben:PPS: mein erster Beitrag in diesem Forum
na denn, willkommen hier
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 auf strukturierte LL übergeben

Beitrag von ts-soft »

Ohne @ bitte :wink:
PureBasic macht das so oder so ByRef

Code: Alles auswählen

Structure test
  x.b
  y.b
EndStructure

Procedure listTestStruct(List a0815.test())
  Debug "In der Proc"
  ForEach a0815()
    Debug Str(a0815()\x) + " " + Str(a0815()\y)
  Next
  AddElement(a0815())
  a0815()\x = 50
  a0815()\y = 100
EndProcedure

NewList a1.test()

For i=7 To 10
  AddElement(a1())
  a1()\x=i
  a1()\y=i*2
Next

listTestStruct(a1())

Debug "Ausserhalb der Proc mit neuem Eintrag"
ForEach a1()
  Debug Str(a1()\x) + " " + Str(a1()\y)
Next
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Pointer auf strukturierte LL übergeben

Beitrag von teamO »

wow, das ging aber schnell. dankeschön.

Das heißt dann also: Wenn ich die Liste in der Prozedur ändere, dann wird sie auch im Hauptprogramm geändert, oder?
Ist das dann bei jedem Datentyp als Parameter so, oder nur bei Listen?

Eine andere Frage: Wofür brauche ich dann überhaupt noch Pointer? Ich hab gedacht, dass die grade dafür da sind, dass man die als Parameter übergebenen Daten innerhalb der Prozedur nicht nur lesen sondern auch ändern kann. Scheinbar hab ich da was falsch verstanden *amKopfKratz*
(gibts denn keinen am-kopf-kratz smily? Könnte man hier doch sicher oft gebrauchen :wink: )
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 auf strukturierte LL übergeben

Beitrag von ts-soft »

teamO hat geschrieben:wow, das ging aber schnell. dankeschön.

Das heißt dann also: Wenn ich die Liste in der Prozedur ändere, dann wird sie auch im Hauptprogramm geändert, oder?
Ist das dann bei jedem Datentyp als Parameter so, oder nur bei Listen?
Nein, bei einfachen Typen (Byte, Word, Char, Long, Integer, Quad, Fload und Double) nicht.

Pointer machen schon Sinn, aber nicht im Zusammenhang mit Deinem Beispiel :wink:

Gruß
Thomas
Antworten