免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8310 | 回复: 12

[函数] 关于函数指针的声明方法 [复制链接]

论坛徽章:
0
发表于 2006-02-19 12:52 |显示全部楼层
在看了精华里的一个贴子后有了这个问题:

http://bbs.chinaunix.net/viewthread.php?tid=422544&extra=page%3D3%26filter%3Ddigest&page=3

贴子里面FH老大用了
static        (*T_NUM)( int, T_NUM, T_NUM )        FuncList[] = {
        SameSign, DiffSign, DiffSign, SameSign
};
来声明一个函数指针数组
但我在编译的里时候,出错提示说‘FuncList’ undeclared


  1. #include <stdio.h>

  2. typedef   int   T_NUM;

  3. #define   SHIFTBITS   ( sizeof( T_NUM ) * 8 - 1 )

  4. static   int   CheckFlag( T_NUM x, T_NUM y )
  5. {
  6.         int   s1 = (x >> SHIFTBITS)&1;
  7.         int   s2 = (y >> SHIFTBITS)&1;
  8. /*
  9. * if x have the same sign with y ,it will return 0 ( all +), or 3 ( all -).
  10. * if x + y - ,it will return 1;
  11. * if x - y + ,it will return 2;
  12. * */
  13.         return ( s1 * 2 + s2 );
  14. }

  15. static   T_NUM   SameSign( int Flag, T_NUM x, T_NUM y )
  16. {
  17.         T_NUM   z = x - y;

  18.         T_NUM   t[2] = { x, y };
  19.         int   s = (z >> SHIFTBITS)&1;

  20.         return t[s];
  21. }

  22. static   T_NUM   DiffSign( int Flag, T_NUM x, T_NUM y )
  23. {
  24.         T_NUM   t[2] = { x, y };

  25.         return t[Flag - 1];
  26. }

  27. /*
  28. * static   (*T_NUM)( int, T_NUM, T_NUM )   FuncList[] = {
  29.         SameSign, DiffSign, DiffSign, SameSign
  30. };
  31. */
  32. static (*T_NUM)( int, T_NUM, T_NUM )   FuncList[] = {
  33.     SameSign, DiffSign, DiffSign, SameSign
  34. };

  35. T_NUM   Max( T_NUM x, T_NUM y )
  36. {
  37.         int   Flag = CheckFlag( x, y );
  38.         return (*FuncList[Flag])( Flag, x, y );
  39. }

  40. int
  41. main()
  42. {
  43.         printf( "Please Input two integer:\n" );
  44.         T_NUM a, b;
  45.         scanf( "%d", &a );
  46.         scanf( "%d", &b );
  47.         printf( "The bigger of the two is       %d\n", Max(a, b) );
  48.         return( 0 );
  49. }
复制代码

论坛徽章:
0
发表于 2006-02-20 12:39 |显示全部楼层
改用了下面这种声明方法可以通过编译:



  1. typedef   T_NUM FUNCL(int, T_NUM, T_NUM);
  2. static FUNCL *FuncList[] = {
  3.          SameSign, DiffSign, DiffSign, SameSign
  4. };

复制代码


不知道用前面那种方法声明应该如何修改?请高手指点

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2006-02-20 12:41 |显示全部楼层
int hello(char*);
int hi(char*);

int (*func[2])(char*);
func[1] = hello;
func[2] = hi;

论坛徽章:
0
发表于 2006-02-20 15:06 |显示全部楼层
1
Checking the following statements, it's so confused about the use of "T_NUM".

  1. typedef   int   T_NUM;

  2. static (*T_NUM)( int, T_NUM, T_NUM )   FuncList[] = {
  3.     SameSign, DiffSign, DiffSign, SameSign
  4. };
复制代码


2
  1. int hello(char*);
  2. int hi(char*);

  3. int (*func[2])(char*);
  4. func[1] = hello;
  5. func[2] = hi;
复制代码

I'am afraid there is no "func[2]" at all in function array "func".

论坛徽章:
0
发表于 2006-02-21 13:03 |显示全部楼层
我自己改过了,但用这种函数原型来声明的方法一直存在问题,不知道这种声明具体应该怎么做?

static (T_NUM *)( int, T_NUM, T_NUM )   FuncList[]= {
SameSign, DiffSign, DiffSign, SameSign
};

上面这样也还是通不过

论坛徽章:
0
发表于 2006-02-21 16:39 |显示全部楼层

回复 5楼 shappen 的帖子

函数指针应该是:int (*function)(int, int)的格式;
所以下面应为

static T_NUM (*)( int, T_NUM, T_NUM )   FuncList[]= {
SameSign, DiffSign, DiffSign, SameSign
};

或者用:

typedef static T_NUM (*_func_)( int, T_NUM, T_NUM )  FUNC;

FUNC FuncList[]= {
SameSign, DiffSign, DiffSign, SameSign
};

这样也是可以的

论坛徽章:
0
发表于 2006-02-22 12:20 |显示全部楼层
原帖由 ivy_zhao 于 2006-2-21 16:39 发表
函数指针应该是:int (*function)(int, int)的格式;
所以下面应为

static T_NUM (*)( int, T_NUM, T_NUM )   FuncList[]= {
SameSign, DiffSign, DiffSign, SameSign
};

或者用:

typedef static  ...


第二种方法根我上面的那种差不多,不过第一种还是不行,按照上面修改后,编译出错:
comp_by_FH.c:41: error: syntax error before ‘)’ token
comp_by_FH.c: In function ‘Max’:
comp_by_FH.c:48: error: ‘FuncList’ undeclared (first use in this function)
comp_by_FH.c:48: error: (Each undeclared identifier is reported only once
comp_by_FH.c:48: error: for each function it appears in.)
新新手 该用户已被删除
发表于 2006-02-22 16:29 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2006-02-22 19:23 |显示全部楼层
有什么问题吗?
俺可是编译通过测试了的。
说一下你的环境。

PS:现在的code显示有问题,看懂意思就行了,照搬恐怕够呛。

[ 本帖最后由 FH 于 2006-2-22 19:26 编辑 ]

论坛徽章:
0
发表于 2006-02-23 12:21 |显示全部楼层
原帖由 FH 于 2006-2-22 19:23 发表
有什么问题吗?
俺可是编译通过测试了的。
说一下你的环境。

PS:现在的code显示有问题,看懂意思就行了,照搬恐怕够呛。



唯一存在问题的就是在声明函数指针数组的地方,为什么声明了,在Max里使用时还是提示未声明?而且出错地方不是在声明的地址,而是在使用的地方

  1. static (*T_NUM)( int, T_NUM, T_NUM )   FuncList[] = {
  2.     SameSign, DiffSign, DiffSign, SameSign
  3. };
复制代码

是上面这种声明方式?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP