标题:怎样用函数指针 指向一个静态函数
只看楼主
duzhiming
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2012-2-13
结帖率:62.07%
已结贴  问题点数:2 回复次数:20 
怎样用函数指针 指向一个静态函数
1c.c
static void task_0(char a)
{
printf("%d\n",a);
}

void change_fun(void (*fun)(char a),static void (*function)(char a))
{
   fun=function;
}
//main.c
//static void (*fp)(char);
void (*fp)(char);//已修改成
int main (void)
{
  change_fun(fp,task_0(6));
  fp(33);//这里调用就出问题了 如果把static修饰符去掉之后就可以了 不知道是哪个语法出现问题了

}




[ 本帖最后由 duzhiming 于 2013-4-3 14:12 编辑 ]
搜索更多相关主题的帖子: void static function 
2013-04-03 13:12
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:1 
你这里面错误太多了,让别人都不知道你想问的是哪个?

首先,void task_0(char a) 既然是static的,那你就不可能在main.c中引用
其次,static是个模块修饰,所以void change_fun( void (*fun)(char a), static void (*function)(char a) )就很搞笑了
再来,fun=function 这一句,你修改的只是fp值的副本fun,估计你想要的是 void change_fun( ** ) { *pfun = function }
最后,change_fun(fp,task_0(6)); 令人完全迷糊

2013-04-03 13:43
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:1 
静态的函数指针?
没玩过

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-04-03 13:46
duzhiming
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2012-2-13
得分:0 
回复 2楼 rjsp
最后那句 我试过了
在如果不在主函数里面使用的实参的话就错误的
taskchange(fp,task_0(33));
你有QQ么 加我一个
当然 是在1c.c文件中申明的 static函数
2013-04-03 14:02
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:0 
肯定出错的一个地方是 fp并未从你的change_fun函数调用中获取到值
所以主函数中fp未初始化调用肯定出错
你要么用返回值接受 要么把参数定义为指向函数的指针的指针(不过不建议这样做 这不是一个好的程序)
下面是几个有疑问的地方
1. 你确定只有你注释的那一行代码有问题 上一行没有问题?
    既然task_0是static修饰的 那么他的名字在除了cc1.c的其他函数外是不可见的 你main.c里的标识符task_0的使用应该会出错
    函数名才会转化为函数指针 你以函数调用的形式传给函数指针形参 会被解释为将该调用的返回值传递给形参
    如果该函数恰好返回一个同类型的函数指针 那么恭喜你 编译通过 Bug埋下 但是你这里task_0并不返回任何值 所以应该编译不过
2. static void (*fp)(char); 这样的句子究竟是如你所愿 fp为一个指向static函数的指针 还是应该解释为一个指向函数的static指针变量呢
   如果你知道 请你也告诉我一下

人生是一场错过 愿你别蹉跎
2013-04-03 14:03
duzhiming
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2012-2-13
得分:0 
回复 5楼 fanpengpeng
起初的时候 我是这样申明的
在main.c中
void (*fun)(char a);
后来发现有问题 在1c.c中的函数调用之后就释放掉了 所以想加上内存修饰符static 在1c.c中加了两次 没成功
于是乎就自己想象了 在main.c中 使用static 来修饰这个函数指针变量- -;
我应该吧问题写的稍微详细一点好了 急了 省略了一些 把主要的写上了0 0
抱歉哦
2013-04-03 14:08
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:0 
后来发现有问题 在1c.c中的函数调用之后就释放掉了

没看太明白 函数调用之后不释放应该是怎么样的 你想要什么样的效果?

人生是一场错过 愿你别蹉跎
2013-04-03 14:11
duzhiming
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2012-2-13
得分:0 
回复 7楼 fanpengpeng
我想用指针再次调用
没明白为什么在
void change_fun(void (*fun)(char a),static void (*function)(char a))
{
   fun=function;
}
这个函数里 fun指针为什么名优初始化呢?
2013-04-03 14:28
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
得分:0 
函数指针成功赋值之后 就可以一直调用啊 没有释放不释放这一说的
程序代码:
void f(int a, int b)
{
    a = b;
}
int main()
{
    int a = 5;
    f(a,3); //a=?

    return 0;
}
你就说 你想干嘛吧 想实现什么 看理论上行不行

人生是一场错过 愿你别蹉跎
2013-04-03 14:34
duzhiming
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2012-2-13
得分:0 
回复 9楼 fanpengpeng
在main.c中 用函数指针这个可以的
我把函数函数指针作为参数 在别的函数去初始化就不行了
void change_fun(void (*fun)(char a),static void (*function)(char a))
{
   fun=function;
}
想在这个函数里实现 fun的初始化 在main.c中调用

我之前是把 函数写在main.c中的 直接赋值  如 实现function之后在main.c中 fun=function然后用函数指针调用用的 然后就可以fun(xx);
2013-04-03 14:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-402957-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.066689 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved