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

Code: Alles auswählen

showtest(testlist2())
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()