Seite 1 von 1
Listen richtig an Prozeduren übergeben
Verfasst: 02.03.2021 10:40
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?
Re: Listen richtig an Prozeduren übergeben
Verfasst: 02.03.2021 11:40
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.
Re: Listen richtig an Prozeduren übergeben
Verfasst: 02.03.2021 11:41
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:
schön wenn andere die gleichen Gedanken haben
Re: Listen richtig an Prozeduren übergeben
Verfasst: 02.03.2021 11:50
von NicTheQuick
STARGÅTE hat geschrieben:Edit:
schön wenn andere die gleichen Gedanken haben
Es ist aber auch nicht immer leicht schneller zu sein als du

Re: Listen richtig an Prozeduren übergeben
Verfasst: 02.03.2021 12:37
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?
Re: Listen richtig an Prozeduren übergeben
Verfasst: 02.03.2021 12:55
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.