我已经阅读了一段时间,但今天我无法解决问题并找到解决方案。
如何从函数表中返回函数指针作为参数?所有similair解决方案都不适用于这个解决方案,最终没有编译。
我尝试了很多方法,但编译器总是返回错误,如:
函数返回函数是不允许的解决方案(使用
typedef void (*func)();
时)
由于NO参数必须传递到最终例程,因此应该可以。
我的简化示例:
void PrintOne(void) { printf("One")};
void PrintTwo(void) { printf("Two")};
struct ScanListStruct
{
int Value;
void (*Routine)(void);
}
const ScanListStruct DoList[] =
{
{1, PrintOne},
{2, PrintTwo}
}
bool GetRoutine(void *Ptr, int Nr)
{
for (int x =0; x<=1; x++)
{
if (DoList[x].Value = Nr)
{
Ptr = DoList[(x)].Routine;
//((*DoList[(x)].Routine)()); // Original Working and executing version!
return true;
}
}
return false;
}
void main(void)
{
int y = 1;
void (*RoutineInMain)(); // Define
if (GetRoutine( RoutineInMain, y) == true) // get the address
{
RoutineInMain(); // Execute the function
}
}
答案 0 :(得分:0)
代码有些问题;
;
等)。main
必须返回int
GetRoutine
应该通过引用接受函数指针,而不仅仅是void*
指向任何内容的指针if
条件应包含相等测试,而不是作业如下所示,按预期工作;
void PrintOne(void) { printf("One"); };
void PrintTwo(void) { printf("Two"); };
struct ScanListStruct
{
int Value;
void (*Routine)(void);
};
const ScanListStruct DoList[] =
{
{1, &PrintOne},
{2, &PrintTwo}
};
bool GetRoutine(void (*&Ptr)(), int Nr)
{
for (int x =0; x<=1; x++)
{
if (DoList[x].Value == Nr)
{
Ptr = *DoList[(x)].Routine;
//((*DoList[(x)].Routine)()); // Original Working and executing version!
return true;
}
}
return false;
}
int main(void)
{
int y = 1;
void (*RoutineInMain)(); // Define
if (GetRoutine( RoutineInMain, y) == true) // get the address
{
RoutineInMain(); // Execute the function
}
}
打印One
。
答案 1 :(得分:0)
您的代码中有很多错误。就像在这里你把昏迷放在错误的地方:
void PrintOne(void) { printf("One")};
void PrintTwo(void) { printf("Two")};
应该是
void PrintOne(void) { printf("One");}
void PrintTwo(void) { printf("Two");}
这里你使用了错误的运算符,而不是==。
if (DoList[x].Value = Nr)
当参数Ptr是一个指针,并且通过值传递时,函数返回时函数中赋值的值将不可用。
这就是您的代码应该如何:
void PrintOne(void) { printf("One"); }
void PrintTwo(void) { printf("Two"); }
typedef void(*prototype)();
struct ScanListStruct
{
int Value;
prototype Routine;
};
const ScanListStruct DoList[] =
{
{ 1, PrintOne },
{ 2, PrintTwo }
};
bool GetRoutine(prototype &Ptr, int Nr)
{
for (int x = 0; x <= 1; x++)
{
if (DoList[x].Value == Nr)
{
Ptr = DoList[(x)].Routine;
return true;
}
}
return false;
}
int main()
{
int y = 1;
prototype RoutineInMain; // Define
if (GetRoutine(RoutineInMain, y) == true) // get the address
{
RoutineInMain(); // Execute the function
}
return 0;
}