[英]C — Array of Function Pointers
我正在使用C,希望用指向各种函数的指针填充数组。 我想使用一个函数来传递要放入数组中的函数的地址。 这是我试图做的没有成功的事情。 编译器对原型和registerTask函数定义中的“ task * ptr”减速度产生了咆哮。 我看到了很多带有指向函数的指针的数组的示例,但没有一个示例首先通过函数参数传递函数的地址,然后更新数组。 任何建议欢迎。
typedef void (*task)(void);
task TaskArray[32];
// Prototypes
void taskA(void);
void taskB(void);
void registerTask(task *ptr);
// This is the problem function definition
void registerTask(task *ptr) {
TaskArray[TaskIndex] = ptr;
++TaskIndex;
}
// Some example functions definitions
void taskA(void) { }
void taskB(void) { }
int TaskIndex = 0;
main {
registerTask(&taskA); // place taskA pointer in array
registerTask(&taskB); // place taskB pointer in array
...later on...
TaskIndex = value; // Set the Task Array function Index
(*TaskArray[TaskIndex]); // call the function
}
task
是一个函数指针。 因此, registerTask
不需要带一个task *ptr
参数(它将是一个函数指针指针),只需一个task ptr
。
另外,您调用该函数的语法不正确; 您需要打开和关闭括号,就像调用常规ol'函数一样。
最后,您不需要在要使用其地址的函数名称前使用与号-函数名称已足够。 并且,在调用函数指针时无需取消引用。
typedef void (*task)(void);
task TaskArray[32];
// Prototypes
void taskA(void);
void taskB(void);
void registerTask(task taskPtr);
void registerTask(task taskPtr) {
TaskArray[TaskIndex] = taskPtr;
++TaskIndex;
}
// Some example functions definitions
void taskA(void) { }
void taskB(void) { }
int TaskIndex = 0;
main {
registerTask(taskA); // place taskA pointer in array
registerTask(taskB); // place taskB pointer in array
//...later on...
TaskIndex = value; // Set the Task Array function Index
TaskArray[TaskIndex](); // call the function
}
我做了一些更改,以便代码可以编译并且可以正常工作。 更改为:
1)移动TaskIndex的范围,以便可以通过registerTask()看到它。
2)删除很多额外的间接
3)修复了函数指针的调用
typedef void (*task)(void);
task TaskArray[32];
// Prototypes
void taskA(void);
void taskB(void);
int TaskIndex = 0;
// This is the problem function definition
void registerTask(task ptr) {
TaskArray[TaskIndex++] = ptr;
}
// Some example functions definitions
void taskA(void) { }
void taskB(void) { }
int
main (void)
{
registerTask(taskA); // place taskA pointer in array
registerTask(taskB); // place taskB pointer in array
...later on...
TaskIndex = value; // Set the Task Array function Index
TaskArray[TaskIndex](); // call the function
}
如果您不使用指针typedef,恕我直言,事情要简单得多。 并且,如果您使用某种命名约定,则类型不同于该类型的实例。 例如:
typedef void TASK(void);
// Prototypes
TASK taskA, taskB;
TASK *TaskArray[32];
int NumTasks = 0;
void registerTask(TASK *ptr)
{
TaskArray[NumTasks++] = ptr;
}
// Some example functions definitions
void taskA(void) { }
void taskB(void) { }
main {
registerTask(&taskA); // place taskA pointer in array
registerTask(&taskB); // place taskB pointer in array
// call the function
TaskArray[0]();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.