Listen richtig an Prozeduren übergeben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Listen richtig an Prozeduren übergeben

Beitrag von 4Planes »

Hallo,

bei einer Durchsicht meines Codes ist mir aufgefallen, dass ich auf zwei verschiedene Arten Listen an Prozeduren übergebe. Der Grund ist: Ich wusste es nicht besser und es war keine Absicht.

Variante 1:

Code: Alles auswählen

Structure struc
  Text.s
EndStructure

NewList LstSettings.struc()

Procedure ProcA ( List Liste.struc() )
  
  MessageRequester ( "", Liste()\Text )
  
EndProcedure

AddElement ( LstSettings() )
LstSettings()\Text = "Das funktioniert"

ProcA ( LstSettings() )
Variante 2:

Code: Alles auswählen

Structure struc
  Text.s
EndStructure

NewList LstSettings.struc()

Procedure ProcB ( *ptrListe.struc )
  
  MessageRequester ( "", *ptrListe\Text )
  
EndProcedure

AddElement ( LstSettings() )
LstSettings()\Text = "Auch das funktioniert"

ProcB ( @LstSettings() )
Ist beides gleichermaßen richtig? Welche Variante sollte ich wählen?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Listen richtig an Prozeduren übergeben

Beitrag von NicTheQuick »

Bei deiner ersten Version hat die Procedure Zugriff auf die komplette Liste, d.h. sie könnte auch welche hinzufügen, entfernen oder einfach von Anfang bis Ende darüber iterieren.

In deiner zweiten Version hat die Procedure nur Zugriff auf das eine per Pointer referenzierte Element und kann sonst nichts mit der Liste machen.

Von daher ist auch nur deine erste Version diejenige, bei der tatsächlich eine Liste übergeben wird. Die zweite Procedure weiß ja im Grunde nicht mal, dass das ein Listenelement ist, das sie da bekommen hat. Das könnte auch jeder andere Speicherbereich sein.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Listen richtig an Prozeduren übergeben

Beitrag von STARGÅTE »

Nur in Variante 1 übergibst du wirklich eine Liste an die Prozedur (besser gesagt die Adresse zur Liste).
In Variante 2 übergibst du nur eine Adresse eines Elements an die Prozedur.

In Variante 1 könntest du in der Prozedur durch alle Elemente iterieren, in Variante 2 nicht, ohne die Liste zu sharen.

Edit: :lol: schön wenn andere die gleichen Gedanken haben
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
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Listen richtig an Prozeduren übergeben

Beitrag von NicTheQuick »

STARGÅTE hat geschrieben:Edit: :lol: schön wenn andere die gleichen Gedanken haben
Es ist aber auch nicht immer leicht schneller zu sein als du :lol:
Bild
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Re: Listen richtig an Prozeduren übergeben

Beitrag von 4Planes »

Vielen Dank für die schnellen Antworten.

ich habe gleich noch zwei Anschlussfragen:

1.) Verstehe ich das also richtig, dass Variante 1 nur eine unnötig komplizierte Art ist, um dasselbe wie das Folgende zu erreichen?

Code: Alles auswählen

Structure struc
  Text.s
EndStructure

NewList LstSettings.struc()

Procedure ProcA()
 
  Shared LstSettings()
  MessageRequester ( "", LstSettings()\Text )
 
EndProcedure

AddElement ( LstSettings() )
LstSettings()\Text = "Das funktioniert"

ProcA()
2.) In meinem Code brauche ich eigentlich immer nur das aktuelle Element der Liste. Sollte ich dann durchgängig Variante 2 wählen oder ist es egal, weil es für die Performance und andere Dinge, die man bedenken muss, keine Rolle spielt, welche Variante man wählt?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Listen richtig an Prozeduren übergeben

Beitrag von NicTheQuick »

Wenn die Procedure nur mit dieser einen globalen Liste arbeiten soll, dann kannst du tatsächlich auch Shared verwenden und erzielst das gleiche. Das ist dann vermutlich auch die Variante mit der besten Performance. Allerdings bezweifle ich, dass du tatsächlich einen messbaren Unterschied zwischen den zwei Versionen feststellen wirst, wenn du sie nicht gerade mehrere Millionen Male aufrufst.

Die Liste oder das Listenelement als Parameter zu übergeben, ergibt ansonsten erst dann Sinn, wenn die Procedure auch mit verschiedenen Listen arbeiten können soll. Denn Prinzipiell kannst du ja viele verschiedene Listen in deinem Programm nutzen.
Bild
Antworten