使用函数 (*foo[])
最编程
2024-06-21 09:03:13
...
函数指针数组的使用场景
函数指针数组即函数指针的数组。
在使用C
语言构造解释器的过程中,对于词法分析得到的Token
在进行语法分析的过程中,对于不同的类别的Token
此处函数需要进行一个识别。输入参数假定为int* buffer
和void* value
,其中int* buffer
用来识别Token
的类型,如浮点数、整数等;void* value
为Token
的具体值。假设此处没有封装成一个类,仅仅是一个主函数需要对不同接受类型的Token
进行不同的函数调用,假设有100种不同的类型。
若按通常做法,会写出如下代码:
void MyFuntion( int* buffer, void*value ){
switch(buffer[0]){
case 1 :
function1();
break;
case 2 :
function2();
break;
case 3 :
......
case 100:
function100();
break;
}
}
按照这种写法,每一次对于不同的Token
都要进行多次判断之后才能找到正确的函数处理函数,代码的执行效率较低,这里就可以适用函数指针数组的概念解决多次判断的问题。
按函数指针数组的思路,会写出如下代码:
void funtion0(void);
......
void funtion100(void);
void (*fun[100])(void) = {funtion0,......,funtion100};
void MyFuntion( int* buffer, void*length ){
(*fun[buffer[0]])();
}
只要2行代码,就完成了100条case语句要做的事,减少了编写代码时工作量,从代码执行效率上来说,直接调用函数指针,也比case语句高。
给一个可运行的实际案例:
#include <stdio.h>
#include <stdbool.h>
#define swap(x,y) {typeof(x) t = x; x = y; y = t;}
bool rule1(int x, int y){
return x > y;
}
bool rule2(int x, int y){
return x < y;
}
bool rule3(int x, int y){
return x%3 < y%3;
}
void sort(int *a,int n, bool (*f)(int,int)){
for (int i = 0; i < n - 1;i ++){
for (int j = 0; j < n - 1;j ++){
if (f(a[j],a[j+1]))
swap(a[j],a[j+1]);
}
}
}
void print(int *a,int n){
for (int i = 0; i < n; i ++){
printf("%d",a[i]);
}
printf("\n");
}
int main(){
int a[10] = {2,1,3,8,0,4,6,5,7,9};
//定义函数指针数组
bool (*f[])(int,int) = {rule1,rule2,rule3};
sort(a,10,f[0]);
print(a,10);
return 0;
}
上一篇: 在编程中,Foo 的常见含义是什么。
推荐阅读
-
每周总结20130814——Android NDK环境的搭建和使用,YUV420SP格式图像的处理
-
将YUV420图像转换为BGR图像的方法使用OpenCvSharp实现
-
在uyuv转换为planar yuv420的过程中所使用的方法进行记录
-
使用OpenGL渲染YUV数据的方法
-
编译Android 使用的 libx264 并使用进行 H.264 编码
-
使用Qt开发音视频应用:通过FFmpeg解码本地摄像头并转换yuv422为yuv420
-
WPF中使用D3D的解决方案实现YUV播放
-
解决树莓派4b 64bit上无法使用 Pi Camera V2 的方法
-
使用ffmpeg将H264数据流解码为YUV420P视频
-
记录海思3559万能平台搭建时使用YUV422的经验与问题