Seite 1 von 1

Structure an Prozedur übergeben

Verfasst: 07.01.2011 12:56
von dllfreak2001
Der Code geht nicht...

Code: Alles auswählen


Structure vertex
  x.l
  y.l
  z.l
EndStructure

Structure poly
  id.l
  posX.l
  posY.l
  color.l
  
  List vertex.vertex()
 
EndStructure

Procedure DisplayPoly(my.vertex)

EndProcedure
der aber schon...

Code: Alles auswählen

Structure vertex
  x.l
  y.l
  z.l
EndStructure

Structure poly
  id.l
  posX.l
  posY.l
  color.l
  
  List vertex.vertex()
 
EndStructure

Procedure DisplayPoly(List my.vertex)

EndProcedure
Wieso kann ich Variablen mit meiner Structure nur als List oder Array übergeben?
Bei mir ist PB 4.51 in Verwendung.

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 13:34
von DarkDragon
Als Pointer (byref) gehts, aber als Wert (byval) kannst du nichts übergeben. War aber schon immer so und wird sich auch nicht ändern:

Code: Alles auswählen

Structure vertex
  x.l
  y.l
  z.l
EndStructure

Structure poly
  id.l
  posX.l
  posY.l
  color.l
 
  List vertex.vertex()

EndStructure

Procedure DisplayPoly(*my.vertex)

EndProcedure

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 14:06
von dllfreak2001
Warum wird sich das nicht ändern?

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 14:18
von DarkDragon
dllfreak2001 hat geschrieben:Warum wird sich das nicht ändern?
Weil das alle paar Monate oder Jahre mal erwähnt wird und immer endet die Diskussion mit "Pointer reicht vollkommen".

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 14:28
von STARGÅTE
@dllfreak2001

Auch deine Liste/Array/map wird nicht als Variable übergeben (auch wenn kein * da ist) sondern auch nur der Pointer zur Liste.
Soll heißen, wenn du eine Liste an eine Prozedur übergibst, und dort änderst, änderst du sich auch im Hauptprogramm!

Falls du wirklich eine Kopie der Variablen übergeben möchtest, sollte dies so mit jeder Struktur möglich sein:

Code: Alles auswählen

Structure vertex
  x.l
  y.l
  z.l
EndStructure

Structure poly
  id.l
  posX.l
  posY.l
  color.l
  
  List vertex.vertex()

EndStructure

Procedure DisplayPoly(*my.vertex)
  Protected my.vertex : CopyStructure(*my, @my, vertex)
  my\x = 3
EndProcedure


DisplayPoly(my.vertex)
Debug my\x

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 16:42
von dllfreak2001
Das weiß ich auch, spräche aber nichts dagegen, wenn sich die Entwickler ranmachen würden.

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 20:18
von STARGÅTE
"spräche aber nichts dagegen"
Das kannst du genauso gut umdrehen, denn es spricht ja auch nicht wirklich etwas dafür, das PureBasic soetwas braucht.

Wenn dann wird es wenn überhaupt er im Zuge der Struktur-Rückgabe aus Prozeduren kommen.

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 20:28
von ts-soft
STARGÅTE hat geschrieben:Wenn dann wird es wenn überhaupt er im Zuge der Struktur-Rückgabe aus Prozeduren kommen.
Dann würde es ja auch erst Sinn machen, trotzdem denke ich nicht, das solche automatisierten
Kopiermechanismen (passt ja nicht auf den Stack) kommen werden. Anfänger brauchen es nicht,
Fortgeschrittene kommen auch mit Pointern klar.

Gruß
Thomas

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 20:46
von NicTheQuick
Also ich fände es auch mal ganz cool, wenn man ganze Strukturen zurückgeben könnte. Dann könnte man sowas machen:

Code: Alles auswählen

Structure Vector
	x.d
	y.d
EndStructure

Procedure.Vector makeVector()
	Protected v.Vector
	v\x = 1.0
	v\y = 2.0
	
	ProcedureReturn v
EndProcedure

Debug makeVector()\x    ;Ausgabe 1.0
Gleichzeitig ergäbe sich die Möglichkeit einfach ein strukturiertes Ergebnis einer Funktion in die nächste zu leiten.

Code: Alles auswählen

Debug VectorLength(makeVector())
Natürlich sind die Beispiele etwas sinnfrei, aber man sieht, was gemeint ist.

Re: Structure an Prozedur übergeben

Verfasst: 07.01.2011 21:03
von STARGÅTE
So einfacher die Handhabung auch sein mag, umso langsammer wird das ganze auch, weil (je nach größe) jedenmal unmenden an Kopiervorgängen gemacht werden und viele Temporärer Speicher erstellt werden müssen.

Ich gebe ja zu, ich habs mir hier und da auch mal gewünscht, allerding komm ich jetzt mit der Pointerlösung sogar besser weg.

Hier hab ich schon mal ein paar Links aus dem Englischen Forum gesammelt: