Unterschiedliche Listen an Proceduren übergeben

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Unterschiedliche Listen an Proceduren übergeben

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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: Unterschiedliche Listen an Proceduren übergeben

Beitrag 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
Bild
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Unterschiedliche Listen an Proceduren übergeben

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
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: Unterschiedliche Listen an Proceduren übergeben

Beitrag 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()
Bild
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Unterschiedliche Listen an Proceduren übergeben

Beitrag von Syntacks_Error »

Das sieht wie eine Lösung aus. Nochmals vielen Dank!
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Unterschiedliche Listen an Proceduren übergeben

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: Unterschiedliche Listen an Proceduren übergeben

Beitrag 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()
Bild
Antworten