Pointer auf Prozeduren unterschiedlicher Datentypen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Pointer auf Prozeduren unterschiedlicher Datentypen

Beitrag von 4Planes »

Hallo!
Bisher bin ich so vorgegangen, wenn ich einen Pointer auf eine Prozedur verwenden wollte:

Code: Alles auswählen

Procedure.f ReturnFloat()
  
  ProcedureReturn 1.005
  
EndProcedure

Procedure.s ReturnString()
  
  ProcedureReturn "Lorem Ipsum"
  
EndProcedure


Prototype.f ProtoReturnFloat( )
Prototype.s ProtoReturnString( )

*ptr_proc1.ProtoReturnFloat = @ReturnFloat()
*ptr_proc2.ProtoReturnString = @ReturnString()


OpenConsole ("")

PrintN ( StrF ( *ptr_proc1() ) )
PrintN ( *ptr_proc2() )

Input()
Das funktioniert reibungslos. Nun hätte ich aber gerne nur eine Variable *ptr_proc, der ich situationsabhänig mal eine Prozedur zuweise, die einen String zurückgibt, mal eine, die einen Integer-Wert zurückgibt, usw. Geht das?

Im Prinzip soll das so funktionieren, nur dass es ja genau so nicht geht:

Code: Alles auswählen

Procedure.f ReturnFloat()
  
  ProcedureReturn 1.005
  
EndProcedure

Procedure.s ReturnString()
  
  ProcedureReturn "Lorem Ipsum"
  
EndProcedure


OpenConsole ("")

*ptr_proc = @ReturnFloat()
PrintN ( StrF ( *ptr_proc() ) )

*ptr_proc2 = @ReturnString()
PrintN ( *ptr_proc() )

Input()
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: Pointer auf Prozeduren unterschiedlicher Datentypen

Beitrag von NicTheQuick »

Nein, das geht so nicht. Am nächsten kommt meiner Meinung noch eine Structure Union. Aber an irgendeiner Stelle muss Purebasic ja wissen wie es eine Funktion aufrufen muss und wie der Rückgabewert zu interpretieren ist. Um Prototypes für jeden Typ kommst du also nicht herum.

Code: Alles auswählen

Procedure.f ReturnFloat()
	ProcedureReturn 1.005
EndProcedure

Procedure.s ReturnString()
	ProcedureReturn "Lorem Ipsum"
EndProcedure


Prototype.f ProtoReturnFloat()
Prototype.s ProtoReturnString()


Structure proto
	StructureUnion
		*p
		f.ProtoReturnFloat
		s.ProtoReturnString
	EndStructureUnion
EndStructure

Define proto.proto

proto\p = @ReturnFloat()
Debug proto\f()

proto\p = @ReturnString()
Debug proto\s()
Bild
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Re: Pointer auf Prozeduren unterschiedlicher Datentypen

Beitrag von 4Planes »

Vielen Dank! Das funktioniert so, wie ich es mir vorgestellt habe.

Ich habe nur ein Problem damit: Ich möchte den Prozeduren, deren Pointer ich jetzt gespeichert habe, einen Pointer auf das Element einer Liste übergeben, zu der die Struktur selber gehört. Mit anderen Worten: Ich habe einen Zirkelbezug.

Etwas vereinfacht:

Code: Alles auswählen

Prototype.f ProtoReturnFloat( *ptrAnimation.Animation )
Prototype.s ProtoReturnString( *ptrAnimation.Animation )

Structure proto
   StructureUnion
      *p
      f.ProtoReturnFloat
      s.ProtoReturnString
   EndStructureUnion
EndStructure

Structure Animation
  Name.s
  ...
  PosX.proto
EndStructure

NewList Animations.Animation()
Egal, in welche Reihenfolge ich den Code bringe, der Compiler hat immer das Problem, dass er eine Sache nicht kennt. Im obigen Beispiel kann er mit *ptrAnimation.Animation nichts anfangen, weil er die Struktur noch nicht kennt. Definiere ich die Prototype weiter unten, gibt es mit der Struktur proto Probleme. Mir schwirrt der Kopf.
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: Pointer auf Prozeduren unterschiedlicher Datentypen

Beitrag von NicTheQuick »

Lass bei Prototype einfach den Typ weg. Wichtig ist nur, dass "Animation" dann in der echten Procedure benutzt wird, also ändere die ersten beiden Zeilen zu dem hier:

Code: Alles auswählen

Prototype.f ProtoReturnFloat( *ptrAnimation )
Prototype.s ProtoReturnString( *ptrAnimation )
Wichtig ist also nur, dass es ein Pointer ist. Die Struktur dahinter ist an dieser Stelle egal.
Bild
Benutzeravatar
4Planes
Beiträge: 37
Registriert: 19.11.2020 17:08

Re: Pointer auf Prozeduren unterschiedlicher Datentypen

Beitrag von 4Planes »

Danke! Klappt jetzt prima!

Aber ich ärgere mich, dass die Lösung so einfach ist. :mrgreen:
Antworten