首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

怎么让函数指针能指向任意函数?怎么保存可变参数

2012-03-12 
如何让函数指针能指向任意函数?如何保存可变参数?如题,先看下面的示例代码:C/C++ code#includestdio.hin

如何让函数指针能指向任意函数?如何保存可变参数?
如题,先看下面的示例代码:

C/C++ code
#include<stdio.h>int max(int x,int y) /* 声明一个函数 */{    return(x > y ? x : y); }  void main()  {  int (*ptr)(int, int);/* 声明一个函数指针 */  int a,b,c;  ptr = max;/* 将func函数的首地址赋给指针f */  scanf("%d%d",&a,&b);  c=(*ptr)(a,b);  printf("a=%d,b=%d,max=%d",a,b,c);}


请问,如何让任何函数都能赋值给同一个函数指针?
也就是说,让这个函数指针能像printf函数那样,支持任意数量,多种类型的参数。

还有,如何保存这N个参数,等需要用函数指针时,将保存的参数作为调用函数指针指向的函数所传递的参数?

比如要实现这样的代码:
C/C++ code
int a(int n, char *s){   //省略代码}int b(char *in, char *out, int n){   //省略代码}int main(){   char str[100], ss[200];   int n, m;   int (*ptr_a)(XXXXXX), (*ptr_b)(XXXXXX);/* 如何声明这两个函数指针? */   /* save_func函数支持不定参数,并且能保存这些参    * 数,等调用run_func函数时,就会调用函数指针    * 指向的函数,并将保存的这些参数传给这个函数     */   save_func( ptr_a, a, n, str);    save_func( ptr_b, b, str, ss, m);   run_func(ptr_a);   run_func(ptr_b);}

run_func函数和save_func函数该如何写?

[解决办法]
三个字:办不到
[解决办法]
可能有其他巧妙的方法
但想像你说的这么智能,c语言真心办不到
[解决办法]
用void指针
[解决办法]
C/C++ code
    /*LZ所说的,实在没想好.. 下面是用共同体写的,算是一个思路吧,    当将某个函数赋值给共同体中的一个函数指针成员后,就可以通过共同体中    其他与函数参数相同的函数名调用*/#include <iostream>using namespace std;void Show(){    cout<<"Show()"<<endl;}void Add(int a, int b){    cout<<"a + b = "<<a + b<<endl;}void PrintStr(char* ch){    cout<<ch<<endl;}typedef void (*PShow)(void);typedef void (*PAdd)(int a, int b);typedef void (*PPrintStr)(char *ch);union FunPtr{    PShow fun1;    PAdd fun2;    PPrintStr fun3;};int main(int argc, char* argv[]){    int a = 3;    int b = 4;    char* str = "Hello World!";    FunPtr fun;    fun.fun1 = (PShow)Show;    fun.fun1();    fun.fun1 = (PShow)Add;    fun.fun2(a, b);    fun.fun1 = (PShow)PrintStr;    fun.fun3(str);    system("pause");    return 0;}
[解决办法]
探讨

C/C++ code

/*LZ所说的,实在没想好.. 下面是用共同体写的,算是一个思路吧,
当将某个函数赋值给共同体中的一个函数指针成员后,就可以通过共同体中
其他与函数参数相同的函数名调用*/
#include <iostream>
using namespace std;
void Show()
{
cout<<"Show()"<<endl;
}

voi……

[解决办法]
参数都不确定怎么知道该用什么?根本不存在这种需求。可以把函数都通过一个相同参数的函数封装起来再调用。
[解决办法]
我也不会!

[解决办法]
用结构体的话转换也需要参数的类型,不知道参数怎么转,联合可能还管用,但是有意义吗
探讨
引用:

参数都不确定怎么知道该用什么?根本不存在这种需求。可以把函数都通过一个相同参数的函数封装起来再调用。

看来,只有像pthread_create()函数那样,传给子线程的参数必须是一个void*类型的变量。
要想让子线程调用的函数能接受多个,多种类型的参数,就必须预先写个结构体,转换成void型传进去,之后,由子线程中的函数转换回来,……

[解决办法]
可以,但是没有意义。怎么知道该传什么类型的结构体。如果你知道该传什么类型的结构体,那么说明你也可以明确地知道应该调用哪个类型函数。这样直接调用不就行了,为啥多此一举用指针?函数指针一般是为运行时多态或者代码重用,没需求应该避免。
------解决方案--------------------


lz 为何有如此需要

目前c 标准中没有,说明 :
 1。 太难,办不到
 2。有别的解决办法,没必要
[解决办法]

探讨
C/C++ code


/*LZ所说的,实在没想好.. 下面是用共同体写的,算是一个思路吧,
当将某个函数赋值给共同体中的一个函数指针成员后,就可以通过共同体中
其他与函数参数相同的函数名调用*/
#include <iostream>
using namespace std;
void Show()
{
cout<<"Show()"<<end……

[解决办法]
Qt我刚刚学了几天。connect的信号和槽都是通过一个宏来生成的。具体原理我还没研究。但是应该用到了C 的编译期多态,个人觉得c语言是无法模仿的编译期多态的。
你说按键问题,每个合法键盘输入都对应一个键盘消息。你应该考虑模仿windows的回调函数(参数固定)。而不是Qt

热点排行