函数返回函数指针从表中作为参数

时间:2015-09-22 13:22:18

标签: c++

我已经阅读了一段时间,但今天我无法解决问题并找到解决方案。

如何从函数表中返回函数指针作为参数?所有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
    }
}

2 个答案:

答案 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;
}