Procedure als Parameter

Für allgemeine Fragen zur Programmierung mit PureBasic.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Procedure als Parameter

Beitrag von Skiller »

Hallo Experten,
Ich frage, ob sowas überhaupt realisierbar ist und ich weiss auch, dass das Beispiel nicht funzt.
aber vielleicht ist es ja doch irgendwie möglich. Habe jedenfalls per Suche nichts gefunden.
DANKE!!!

Code: Alles auswählen

Procedure TestFunc(Value.i)
  Debug Value
EndProcedure

Procedure func(ParaFunc)
  Protected i
  For i = 1 To 10
    ParaFunc(i)
  Next
EndProcedure

func(TestFunc(x))

Moderation: Doppeleintrag vermülleimert.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Procedure als Parameter

Beitrag von bobobo »

Wenn du richtig schreibst, dann klappt es auch mit dem Code :D

Code: Alles auswählen

..
For i = 1 To 10
  TestFunc(i)  ;<-- hier darf man sich nicht vertun :)
Next
..
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Procedure als Parameter

Beitrag von ts-soft »

Ich denke mal, er meint eher so etwas:

Code: Alles auswählen

Prototype TestFunc(Value.i)

Procedure TestFunc(Value.i)
  Debug Value
EndProcedure

Procedure func(ParaFunc)
  Protected myfunc.Testfunc = ParaFunc
  Protected i
  For i = 1 To 10
    myfunc(i)
  Next
EndProcedure


func(@Testfunc()) 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Procedure als Parameter

Beitrag von STARGÅTE »

Der Vollständigkeitshalber, geht das auch ohne die Zwischenvariable:

Code: Alles auswählen

Prototype TestFunc(Value.i)

Procedure TestFunc(Value.i)
  Debug Value
EndProcedure

Procedure func(ParaFunc.Testfunc)
  Protected i
  For i = 1 To 10
    ParaFunc(i)
  Next
EndProcedure


func(@Testfunc()) 
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
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Procedure als Parameter

Beitrag von bobobo »

Bitte um Aufklärung.
Für was ist diese Verknotung letztlich brauchbar?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Procedure als Parameter

Beitrag von NicTheQuick »

Du kannst der Procedure 'func' verschiedene andere Procedures des selben Prototypes 'TestFunc' übergeben, mit denen sie dann was anstellen kann. Z.B. könnte 'TestFunc' ja der Prototype für eine Metrik sein, also 'Prototype.d Metrik(*x.Punkt, *y.Punkt)'. Dann kann man verschiedene konkrete Implementierungen für Metriken bauen wie z.B. für die euklidische Metrik und die dann anderen Funktionen übergeben.
Eine weitere Möglichkeit wäre auch ein Callback wie es auch 'SetWindowCallback()' schon macht. Das kriegt auch einen Pointer zu einer Procedure, die bestimmte Parameter haben muss.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Procedure als Parameter

Beitrag von STARGÅTE »

Das (wie ich finde) beste Beispiel ist die Funktion bzw. das Macro CustomSortList():

Code: Alles auswählen

Prototype.i CustomSortListComparisonCallback(*Element1, *Element2)

Structure CustomSortList
	Callback.CustomSortListComparisonCallback
	Quit.i
	*Element
EndStructure

Threaded CustomSortList.CustomSortList

Macro CustomSortList(LinkedList, ComparisonCallback)
	CustomSortList\Callback = ComparisonCallback
	Repeat
		CustomSortList\Quit = #True
		ForEach LinkedList
			CustomSortList\Element = @LinkedList
			While NextElement(LinkedList)
				If CustomSortList\Callback(CustomSortList\Element, @LinkedList)
					SwapElements(LinkedList, CustomSortList\Element, @LinkedList)
					CustomSortList\Quit = #False
				EndIf
			Wend
			ChangeCurrentElement(LinkedList, CustomSortList\Element)
		Next
	Until CustomSortList\Quit
EndMacro
Mit diesem Macro kann man eine beliebige LinkedList mit einer beliebigen Vergleichsfunktion sortieren lassen.
Hier zwei Beispiele, wie man Zahlen (ohne berücksichtigung des Vorzeichens) sortieren kann und eine strukturierte Liste zB nach Namen und zusätzlich nach Vorname sortieren kann:

Code: Alles auswählen

;- Beispiel 1

NewList Zahlen.i()
Define I.i

Procedure SortWithoutSign(*Integer1.Integer, *Integer2.Integer)
	If Abs(*Integer1\i) > Abs(*Integer2\i)
		ProcedureReturn #True
	EndIf
EndProcedure


RandomSeed(1)
For I = 1 To 10
	AddElement(Zahlen())
	Zahlen() = Random(200)-100
Next

Debug "Unsortiert:"
ForEach Zahlen()
	Debug Zahlen()
Next
Debug "Sortiert:"
CustomSortList(Zahlen(), @SortWithoutSign())
ForEach Zahlen()
	Debug Zahlen()
Next

;- Beispiel 2


Structure Person
	Name.s
	Vorname.s
EndStructure

NewList Person.Person()
Define I.i

Procedure SortPerson(*Person1.Person, *Person2.Person)
	If *Person1\Name > *Person2\Name
		ProcedureReturn #True
	ElseIf *Person1\Name = *Person2\Name And *Person1\Vorname > *Person2\Vorname
		ProcedureReturn #True
	EndIf
EndProcedure


RandomSeed(1)
For I = 1 To 10
	AddElement(Person())
	Person()\Name = Chr(Random(26)+65)
	Person()\Vorname = Chr(Random(26)+65)
Next

Debug "Unsortiert:"
ForEach Person()
	Debug Person()\Name+", "+Person()\Vorname
Next
Debug "Sortiert:"
CustomSortList(Person(), @SortPerson())
ForEach Person()
	Debug Person()\Name+", "+Person()\Vorname
Next
Unsortiert:
45
-64
22
83
-100
-76
1
-42
-15
68
Sortiert:
1
-15
22
-42
45
-64
68
-76
83
-100
Unsortiert:
T, E
Q, Y
A, D
N, H
L, W
T, T
Q, I
Y, B
C, E
C, C
Sortiert:
A, D
C, C
C, E
L, W
N, H
Q, I
Q, Y
T, E
T, T
Y, B
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
bobobo
jaAdmin
Beiträge: 3875
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Procedure als Parameter

Beitrag von bobobo »

cool
Bild
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten