digitalmars.D - IupSetCallback function passing
- James Wirth (30/30) Mar 18 2014 When trying to associate an Icallback function to a button in the
- Infiltrator (6/36) Mar 18 2014 Why is it that prefixing it with '&' does not work? Am I safe in
- Rikki Cattermole (5/35) Mar 18 2014 Using & to get the function pointer is correct in this case.
When trying to associate an Icallback function to a button in the IUP GUI API using the IupSetCallback function, the D compiler seems to insist on evaluating that callback in order to pass its value rather than passing the function itself. I get this dmd compiler error (the source is named hitmeiup.d) : Error: function hitmeiup.hitMeAct (Ihandle_* dmy) is not callable using argument types () hitmeiup.d(41): Error: expected 1 function arguments, not 0 for this line calling the IupSetCallback: IupSetCallback(btn,"ACTION",hitMeAct); The callback function was named hitMeAct as follows: extern(C) { int hitMeAct(Ihandle *dmy) { sayHit(); return 0; } } I have also tried it with hitMeAct being a D function instead of extern(C). It is as if the call to IupSetCallback is interpreting hitMeAct to be a property function and that the call was meant to be: IupSetCallback(btn,"ACTION",hitMeAct()); It there someway to force D to consider the hitMeAct parameter to be passing a function and NOT calling it? I tried prefixing a & - no go. Would welcome any hints. Yes I have already looked at the .d files purporting to provide access to IUP. And a more or less equivalent C program works fine.
Mar 18 2014
On Wednesday, 19 March 2014 at 02:21:18 UTC, James Wirth wrote:When trying to associate an Icallback function to a button in the IUP GUI API using the IupSetCallback function, the D compiler seems to insist on evaluating that callback in order to pass its value rather than passing the function itself. I get this dmd compiler error (the source is named hitmeiup.d) : Error: function hitmeiup.hitMeAct (Ihandle_* dmy) is not callable using argument types () hitmeiup.d(41): Error: expected 1 function arguments, not 0 for this line calling the IupSetCallback: IupSetCallback(btn,"ACTION",hitMeAct); The callback function was named hitMeAct as follows: extern(C) { int hitMeAct(Ihandle *dmy) { sayHit(); return 0; } } I have also tried it with hitMeAct being a D function instead of extern(C). It is as if the call to IupSetCallback is interpreting hitMeAct to be a property function and that the call was meant to be: IupSetCallback(btn,"ACTION",hitMeAct()); It there someway to force D to consider the hitMeAct parameter to be passing a function and NOT calling it? I tried prefixing a & - no go. Would welcome any hints. Yes I have already looked at the .d files purporting to provide access to IUP. And a more or less equivalent C program works fine.Why is it that prefixing it with '&' does not work? Am I safe in assuming that it then complains about hitMeAct being not callable with parameters ()? In which case, try currying it: import std.functional : curry; IupSetCallback(btn, "ACTION", &curry!(hitMeAct, dmy));
Mar 18 2014
On Wednesday, 19 March 2014 at 02:21:18 UTC, James Wirth wrote:When trying to associate an Icallback function to a button in the IUP GUI API using the IupSetCallback function, the D compiler seems to insist on evaluating that callback in order to pass its value rather than passing the function itself. I get this dmd compiler error (the source is named hitmeiup.d) : Error: function hitmeiup.hitMeAct (Ihandle_* dmy) is not callable using argument types () hitmeiup.d(41): Error: expected 1 function arguments, not 0 for this line calling the IupSetCallback: IupSetCallback(btn,"ACTION",hitMeAct); The callback function was named hitMeAct as follows: extern(C) { int hitMeAct(Ihandle *dmy) { sayHit(); return 0; } } I have also tried it with hitMeAct being a D function instead of extern(C). It is as if the call to IupSetCallback is interpreting hitMeAct to be a property function and that the call was meant to be: IupSetCallback(btn,"ACTION",hitMeAct()); It there someway to force D to consider the hitMeAct parameter to be passing a function and NOT calling it? I tried prefixing a & - no go. Would welcome any hints. Yes I have already looked at the .d files purporting to provide access to IUP. And a more or less equivalent C program works fine.Using & to get the function pointer is correct in this case. You may need to do a cast for the pointer to what c expects. However it will work fine. The brackets forces it to call it. Don't.
Mar 18 2014