#include <stdio.h>
typedef struct
{
char c; // several simple type variables...
int(*eventhandler)(int param); // function pointer member (maybe, it would do with double indirection...?)
} BtnStruct;
int function0(int param) // say, there is a similar function1()
{
int retval=0;
// do something
return(retval);
}
int function1(int param) // say, there is a similar function1()
{
int retval=0;
// do something
return(retval);
}
int main(){
BtnStruct Btn0; // BtnStruct variable
BtnStruct Btn1;
BtnStruct *BtnStructArray[2]; // array of pointers, pointed to BtnStruct type variables
BtnStructArray[0] = &Btn0; // fill the array with addresses of BtnStruct variables
BtnStructArray[1] = &Btn1;
int returnvalue; // just for test
// In Run time:
BtnStructArray[0]->eventhandler = function0; // I try to give the address of the function, to the function pointer member
BtnStructArray[1]->eventhandler = function1;
returnvalue = BtnStructArray[0]->eventhandler(10); // here I want to call the pointed function with parameter
(void)returnvalue; // But the function is not invoked
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdCAKewogICAgY2hhciBjOyAvLyBzZXZlcmFsIHNpbXBsZSB0eXBlIHZhcmlhYmxlcy4uLgogICAgaW50KCpldmVudGhhbmRsZXIpKGludCBwYXJhbSk7ICAvLyBmdW5jdGlvbiBwb2ludGVyIG1lbWJlciAobWF5YmUsIGl0IHdvdWxkIGRvIHdpdGggZG91YmxlIGluZGlyZWN0aW9uLi4uPykKfSBCdG5TdHJ1Y3Q7CgppbnQgZnVuY3Rpb24wKGludCBwYXJhbSkgLy8gc2F5LCB0aGVyZSBpcyBhIHNpbWlsYXIgZnVuY3Rpb24xKCkKewogICAgaW50IHJldHZhbD0wOwoJcHJpbnRmKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKCiAgICAvLyBkbyBzb21ldGhpbmcKCiAgICByZXR1cm4ocmV0dmFsKTsKfQppbnQgZnVuY3Rpb24xKGludCBwYXJhbSkgLy8gc2F5LCB0aGVyZSBpcyBhIHNpbWlsYXIgZnVuY3Rpb24xKCkKewogICAgaW50IHJldHZhbD0wOwoJcHJpbnRmKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKICAgIC8vIGRvIHNvbWV0aGluZwoKICAgIHJldHVybihyZXR2YWwpOwp9CgppbnQgbWFpbigpewoKQnRuU3RydWN0IEJ0bjA7IC8vIEJ0blN0cnVjdCB2YXJpYWJsZSAKQnRuU3RydWN0IEJ0bjE7CgpCdG5TdHJ1Y3QgKkJ0blN0cnVjdEFycmF5WzJdOyAvLyBhcnJheSBvZiBwb2ludGVycywgcG9pbnRlZCB0byBCdG5TdHJ1Y3QgdHlwZSB2YXJpYWJsZXMKCkJ0blN0cnVjdEFycmF5WzBdID0gJkJ0bjA7IC8vIGZpbGwgdGhlIGFycmF5IHdpdGggYWRkcmVzc2VzIG9mIEJ0blN0cnVjdCB2YXJpYWJsZXMKQnRuU3RydWN0QXJyYXlbMV0gPSAmQnRuMTsKCmludCByZXR1cm52YWx1ZTsgLy8ganVzdCBmb3IgdGVzdAoKCi8vIEluIFJ1biB0aW1lOgoKQnRuU3RydWN0QXJyYXlbMF0tPmV2ZW50aGFuZGxlciA9IGZ1bmN0aW9uMDsgLy8gSSB0cnkgdG8gZ2l2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24sIHRvIHRoZSBmdW5jdGlvbiBwb2ludGVyIG1lbWJlcgpCdG5TdHJ1Y3RBcnJheVsxXS0+ZXZlbnRoYW5kbGVyID0gZnVuY3Rpb24xOyAgICAKCgpyZXR1cm52YWx1ZSA9IEJ0blN0cnVjdEFycmF5WzBdLT5ldmVudGhhbmRsZXIoMTApOyAvLyBoZXJlIEkgd2FudCB0byBjYWxsIHRoZSBwb2ludGVkIGZ1bmN0aW9uIHdpdGggcGFyYW1ldGVyIAoodm9pZClyZXR1cm52YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdXQgdGhlIGZ1bmN0aW9uIGlzIG5vdCBpbnZva2VkCglyZXR1cm4gMDsKfQo=