Structure an Prozedur übergeben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Structure an Prozedur übergeben

Beitrag 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.
I´a dllfreak2001
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Structure an Prozedur übergeben

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: Structure an Prozedur übergeben

Beitrag von dllfreak2001 »

Warum wird sich das nicht ändern?
I´a dllfreak2001
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Structure an Prozedur übergeben

Beitrag 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".
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Structure an Prozedur übergeben

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Re: Structure an Prozedur übergeben

Beitrag von dllfreak2001 »

Das weiß ich auch, spräche aber nichts dagegen, wenn sich die Entwickler ranmachen würden.
I´a dllfreak2001
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Structure an Prozedur übergeben

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Structure an Prozedur übergeben

Beitrag 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
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
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Structure an Prozedur übergeben

Beitrag 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.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Structure an Prozedur übergeben

Beitrag 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:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten