2019-12-30 19:26发布
void testInt(int a){ printf("testInt a = %d " , a); } void testFloat(float a){ printf("testFloat a = %f " , a); } void run(){ void* funp; funp = testInt; (*(u32(*)())funp)(3); }
javenreal 发表于 2017-3-5 19:55 把第二个函数改成这样:void testFloat(int a){ printf("testFloat a = %f " , (float)a ...
javenreal 发表于 2017-3-5 22:38 testFloat这样的函数不要用值传。参数用void *,在函数内再转换成int *或float *
xiaoergao 发表于 2017-3-5 22:23 首先感谢您的回复 你提到的应用场景是在源程序里面这样使用是可以的。
最多设置5个标签!
这样传过来的a的值会变掉
之前的做法是:
先取地址-》再转为对应类型的指针类型-》再取值
这样做一直没问题。但是弊端就是只能转成固定的数据类型,而不是根据数据的不同转换成不同的数据类型。
如果你重载了256个函数,那你说的没错。无论你怎么折腾,都是避免不了的。
然而,办法还是有的,比如这样,C/C++通用,无论考虑各种条件,伪代码如下:
- typedef union{
- int Int[8];
- float Float[8];
- } CParam;
- static void test0(CParam p){ //8个参数全为int
- printf("testInt p = %d %d %d %d %d %d %d %d
" , p.Int[0], p.Int[1], p.Int[2], p.Int[3], ...);
- }
- static void test1(CParam p){ //8个参数:int int int int int int int float
- printf("testInt p = %f %d %d %d %d %d %d %d
" , p.Float[0], p.Int[1], p.Int[2], p.Int[3], ...);
- }
- ...
- typedef void(*pfnFun)(CParam);
- const pfnFun fnFuncs[] = {test0, test1, ...};
-
- void run(){
- int type = 0; // 获取参数样式
- CParam prm; // 参数列表,根据你的串口填充是int还是float
- char* param[8]; //从你的串口中分离出来的参数。最简单的方法:将逗号换成0x00就好了,然后填充下一个参数
- for(int i = 0; i<8; i++){
- if(strstr('.', param[i])){ //float
- prm.Float[i] = atof(param[i]);
- type |= 1 << i;
- } else
- prm.Int[i] = atoi(param[i]);
- }
- fnFuncs[type](prm);
- }
复制代码为什么不转成统一的类型再计算
比如统一转成float的
如果你觉得精度不够,也可以统一转成一个自定义的格式
比如64位有效数字,32位指数
一周热门 更多>