Seite 1 von 1
Unterschiedliche Listen an Proceduren übergeben
Verfasst: 16.05.2018 10:56
von Syntacks_Error
Hallo,
ich mache mit pb viele kleine einfache Progrämmchen, die irgendwelche Daten auswerten. Das geht schnell, macht Spaß und ist hilfreich, aber als Programierer bin ich eine Niete. Daher weiß ich nicht:
Ich habe mehrere strukturierte Listen mit den gleichen Strukturen, aber unterschiedlichem Inhalten, das muss auch so sein. Die Listen sollen durch die selben Prozeduren verarbeitet werden. Also muss ich den Prozeduren klarmache, welche Liste sie verarbeiten sollen.
Code: Alles auswählen
OpenConsole()
Structure test
a.s
b.s
EndStructure
NewList testlist1.test()
AddElement(testlist1())
testlist1()\a = "Liste 1 a"
testlist1()\b = "Liste 1 b"
NewList testlist2.test()
AddElement(testlist2())
testlist2()\a = "Liste 2 a"
testlist2()\b = "Liste 2 b"
Procedure showtest(List testlist1.test()) ;<= Hier sollen beide Listen verarbeitet werden können
PrintN(testlist1()\a) ;<= hier soll auch die testlist2 ausgeworfen werden können
PrintN(testlist1()\b)
EndProcedure
;
showtest(testlist1.test()) ; Hier will ich auch testlist2.test übergeben können
;showtest(irgendeineliste.test()) ???
Input()
Wie mache ich dass, das ich showtest() auch testlist2 übergeben kann?
Re: Unterschiedliche Listen an Proceduren übergeben
Verfasst: 16.05.2018 11:01
von NicTheQuick
Es ist doch schon alles richtig. Du musst jetzt nur
schreiben.
Vielleicht solltest du den Parameter in der Prozedur anders nennen, damit es nicht zu Verwirrungen kommt:
Code: Alles auswählen
Procedure showtest(List inList.test()) ;<= Hier sollen beide Listen verarbeitet werden können
PrintN(inList()\a) ;<= hier soll auch die testlist2 ausgeworfen werden können
PrintN(inList()\b)
EndProcedure
Übrigens musst du das ".test" nur beim definieren der Liste angeben. Danach nie wieder. Das ist auch praktischer, falls du die Struktur mal ändern willst. Dann musst du es nämlich an viel weniger Stellen ändern.
Damit deine Prozedur auch immer funktioniert, solltest du darauf achten, dass immer ein Element in der Liste aktiv ist, oder du iterierst gleich über die Liste:
Code: Alles auswählen
Procedure showtest(List inList.test())
ForEach inList()
PrintN(inList()\a)
PrintN(inList()\b)
Next
EndProcedure
Re: Unterschiedliche Listen an Proceduren übergeben
Verfasst: 16.05.2018 12:10
von Syntacks_Error
Vielen Dank! Das ist so trivial, kein Wunder, dass ich nicht darauf gekommen bin
Das hilft mir schon einmal weiter.
Eigentlich hatte ich mir aber eher soetwas vorgestellt:
If a = 1
liste = testliste1()
else
liste = testliste2()
endif
machedasmit(liste())
machediesmit(liste())
.
.
.
Sonst muss ich ja die Prozedurenaufrufe immer neu für jede Liste schreiben. Läßt sich das vermeiden?
Re: Unterschiedliche Listen an Proceduren übergeben
Verfasst: 16.05.2018 12:19
von NicTheQuick
Du kannst leider nicht so einfach einen Alias für eine Liste erstellen. Du könntest deine Listen aber in ein Array packen.
Code: Alles auswählen
OpenConsole()
Structure test
a.s
b.s
EndStructure
Structure Liste
List l.test()
EndStructure
Dim liste.Liste(1)
AddElement(liste(0)\l())
liste(0)\l()\a = "Liste 0 a"
liste(0)\l()\b = "Liste 0 b"
AddElement(liste(1)\l())
liste(1)\l()\a = "Liste 1 a"
liste(1)\l()\b = "Liste 1 b"
Procedure showtest(List inList.test())
ForEach inList()
PrintN(inList()\a)
PrintN(inList()\b)
Next
EndProcedure
Repeat
Print("Welche Liste? [0/1] ")
useList = Val(Input())
Until useList = 0 Or useList = 1
showtest(liste(useList)\l()) ; Hier will ich auch testlist2.test übergeben können
;showtest(irgendeineliste.test()) ???
Input()
Re: Unterschiedliche Listen an Proceduren übergeben
Verfasst: 16.05.2018 14:52
von Syntacks_Error
Das sieht wie eine Lösung aus. Nochmals vielen Dank!
Re: Unterschiedliche Listen an Proceduren übergeben
Verfasst: 16.05.2018 15:24
von hjbremer
ohne irgendwas zu testen
select a
case 1: machedasmit(testliste1())
case 2: machediesmit(testliste2())
case 3: ;usw.
default: ;machediesmit(baseliste()) oder explodiere
endselect
Re: Unterschiedliche Listen an Proceduren übergeben
Verfasst: 17.05.2018 01:31
von Demivec
NicTheQuick hat geschrieben:Du kannst leider nicht so einfach einen Alias für eine Liste erstellen. Du könntest deine Listen aber in ein Array packen.
Auch mit einem Zeiger:
Code: Alles auswählen
OpenConsole()
Structure test
a.s
b.s
EndStructure
Structure Liste
List l.test()
EndStructure
Dim liste.Liste(1)
AddElement(liste(0)\l())
liste(0)\l()\a = "Liste 0 a"
liste(0)\l()\b = "Liste 0 b"
AddElement(liste(1)\l())
liste(1)\l()\a = "Liste 1 a"
liste(1)\l()\b = "Liste 1 b"
Procedure showtest(List inList.test())
ForEach inList()
PrintN(inList()\a)
PrintN(inList()\b)
Next
EndProcedure
Define *Liste.Liste
Repeat
Print("Welche Liste? [0/1] ")
useList = Val(Input())
Until useList = 0 Or useList = 1
*Liste = liste(useList)\l()
showtest*Liste\l())
Input()