Seite 1 von 1

Pointer auf Prozeduren unterschiedlicher Datentypen

Verfasst: 23.03.2021 12:35
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()

Re: Pointer auf Prozeduren unterschiedlicher Datentypen

Verfasst: 23.03.2021 12:55
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()

Re: Pointer auf Prozeduren unterschiedlicher Datentypen

Verfasst: 23.03.2021 20:18
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.

Re: Pointer auf Prozeduren unterschiedlicher Datentypen

Verfasst: 23.03.2021 20:32
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.

Re: Pointer auf Prozeduren unterschiedlicher Datentypen

Verfasst: 23.03.2021 21:26
von 4Planes
Danke! Klappt jetzt prima!

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