Cast - Function <-> Object
Übersicht

![]() |
Silver_KneeBetreff: Cast - Function <-> Object |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
kennt jemand nen geschickten Weg ne Funktion zu Object und zurück zu casten? Ich dachte daran Funktionen als Value in ne Map zu stecken und dann wieder herauszuholen. Normaler Cast code wäre ja sowas in der Art: BlitzMax: [AUSKLAPPEN] Framework BRL.StandardIO Aber BMax kommt da nicht weit. Die Funktion in das Object stecken ist noch drin aber der Cast zurück wird Syntaktisch nicht erkannt oder hab ich da jetzt einen Denkfehler drin? Alternative wäre halt ein Helfer-Typ. Macht aber wenig Spaß, da für jede Funktionssignatur ein eigener Typ angelegt werden muss. BlitzMax: [AUSKLAPPEN] Framework BRL.StandardIO |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schon Funktion zu objekt scheitert, er meckert nur an der falschen stelle bei deinem Testcode.
Sobald Du die Zeile die das Objekt in ein Funktion zurückcasten soll auskommentierst wird das ersichtlich. Ein Functionpointer ist eben kein Objekt, sondern ein Pointer. Ich fürchte ohne die Gluelogic deines Helpers wirst Du da nicht weiter kommen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na gut. Eigentlich schade, in manchen Programmiersprachen ist eine Funktion auch ein Objekt. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe beim Suchen eine Lösung gefunden, die allerdings mit Vorsicht zu geniessen ist.
Es ist auch kein Object-Cast, sondern arbeitet mit einem Array aus Byte Pointern. Wie man sieht kann man so die Funktionen auch mit völlig falschen Argumenttypen beliefern, es ist also fehleranfällig: Code: [AUSKLAPPEN] SuperStrict
Function func0:Int(MSG:String) Print "Function 0 says, ~q"+MSG+"~q" End Function Function func1:Int(MSG:String ,stuff:Int) Print "Function 1 says, ~q"+MSG+"~q"+stuff End Function Function func2:Int(MSG:Int) Print "Function 2 says, ~q"+MSG+"~q" End Function Function func3:Int(MSG:String) Print "Function 3 says, ~q"+MSG+"~q" End Function Local funcs:Byte Ptr[4] funcs[0]=func0 funcs[1]=func1 funcs[2]=func2 funcs[3]=func3 For Local func:Byte Ptr=EachIn funcs Local _func(MSG$,stuff:Int)=func _func("Hello!",1) Next Local map:TMap = New TMap map.insert("Func0" , String("0") ) map.insert("Func1" , String("1") ) map.insert("Func2" , String("2") ) map.insert("Func3" , String("3") ) Local str:String = Input("Which Func to run? ") Local func:Int(MSG:String) = funcs[Int(String(map.ValueforKey(str)) )] func("Hello") Edit: Habe den Code um eine Map erweitert, es geht halt nur mit dem Umweg über das Array. Die Values in der Map sind die Positionen im Array als String gespeichert. Edit2: Mal ein Beispiel, du kannst per Input wählen welche Function ausgeführt wird. Bei einer nicht-validen Eingabe wird Func0 aufgerufen, sie kann also als default-Zweig benutzt werden. Vorsicht: Case Sensitive! |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nice. Jetzt wäre auch ein Helfer Typ nicht mehr so schlimm. Man brauch ja nur einen für den Byte Ptr. Der könnte dann sogar noch Signaturinformationen von der Funktion enthalten. Wäre ne schöne Erweiterung für die Reflections: Eine Map mit Helfer-Typen für jede Funktion im Programm alla Function.ForName.
Edit: ich hab übrigens den weg jetzt so umgesetzt: Function -> Byte Ptr -> Int -> String -> Object Und das geht auch wieder zurück. Der letzte Schritt vom Pointer zur Funktion ist halt gefährlich weil man die Parameter kennen muss. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group