想不明白的问题,请大家帮忙看一下。
随便写着玩的程序。想定义个函数指针数组,根据需要调用不同的函数,vc6编译出错。粗体那行:FUNC2.C(23) : error C2120: 'void' illegal with all types#include "stdio.h"
#include "string.h"
int a[10]={1,2,3,4,5,6,7,8,9,10};
void * func1(int x)
{
if((x>0)&&(x<9))
return &a[x];
else
return NULL;
}
void * func2(int x)
{
if((x>0)&&(x<9))
return &a[9-x];
else
return NULL;
}
void (* signal(int sig,int num))(int)
{
void (* pfun[2])(int);
pfun[0]=func1;
pfun[1]=func2;
[bo]return (*pfun[sig-1])(num);[/bo]}
void main()
{
int a,fc;
int *p=NULL;
printf("please input a integer0~9:\n");
scanf("%d",&a);
if((a<9)&&(a>0))
{
printf("please input a function name:1 or 2\n");
scanf("%d",&fc);
if((fc==1)||(fc==2))
p=(int *)signal(fc,a);
else
printf("incorrect function!\n");
if(p!=NULL)
printf("%d",*p);
else
printf("incorrect value!");
}
else
printf("please input a integer 0~9!");
}
----------------解决方案--------------------------------------------------------
你的程序想改不容易啊..呵呵...你自己好好改啊..返回指针是null可能引发异常..指向函数的指针..
----------------解决方案--------------------------------------------------------
回复 2# 的帖子
是不是指针数组定义错了?我都快糊涂了。。。
----------------解决方案--------------------------------------------------------
原来写的程序,编译,运行都没有问题的,我想改一下,换一种方法实现,结果就。。。
这是昨天写的,和刚才那个功能一样,这个就没有问题,出错的那个改了一下参数,多定义了一个函数指针数组,到底怎么回事,为什么编译出错?/*本程序的功能是通过输入调用相应的函数,求下标对应的元素值,或者下标模9的元素值*/
#include "stdio.h"
#include "string.h"
/*定义一个外部数组a*/
int a[10]={1,2,3,4,5,6,7,8,9,10};
/*func1的功能是求得a[x]*/
void * func1(int x)
{
if((x>0)&&(x<9))
return &a[x];
else
return NULL;
}
/*func2的功能是求得a[9-x]*/
void * func2(int x)
{
if((x>0)&&(x<9))
return &a[9-x];
else
return NULL;
}
/*把函数指针作为参数*/
void (* signal(int sig,void * func(int x)))(int x)
{
return func(sig);
}
void main()
{
int a;
char * s=NULL;
int * p=NULL;
printf("please input number 0~9\n");
scanf("%d",&a);
printf("please input type:func1,or func2\n");
scanf("%s",s);
if(strcmp(s,"func1")==0)
p=(int *)signal(a,func1);
else
if(strcmp(s,"func2")==0)
p=(int *)signal(a,func2);
else
{
printf("please input correct function name!\n");
exit(0);
}
if(p!=NULL)
printf("%d",*p);
else
{
printf("incorrect value!");
exit(0);
}
}
----------------解决方案--------------------------------------------------------
return (*pfun[sig-1])(num);}
个人感觉这表达式返回的是一个函数返回值,而不是一个指针,另外signal函数是库函数
----------------解决方案--------------------------------------------------------
不好意思..我怀疑编译器不认识...
程序很难理解的..最好不呀袄用啊
#include "stdio.h"
#include "string.h"
int a[10]={1,2,3,4,5,6,7,8,9,10};
int * func1(int x)
{
if((x>0)&&(x<9))
return &a[x];
else
return NULL;
}
int * func2(int x)
{
if((x>0)&&(x<9))
return &a[9-x];
else
return NULL;
}
int* fun0(int num)
{
int * (* pfun[2])(int);
pfun[0]=func1;
pfun[1]=func2;
if((*pfun[0])(num))
return (*pfun[0])(num);
else
return (*pfun[1])(num);
}
void main()
{
int a,fc;
int *p=NULL;
int* (*signal)(int);
signal=fun0;
printf("please input a integer0~9:\n");
scanf("%d",&a);
if((a<9)&&(a>0))
{
printf("please input a function name:1 or 2\n");
scanf("%d",&fc);
if((fc==1)||(fc==2))
p=(*signal)(a);
else
printf("incorrect function!\n");
if(p!=NULL)
printf("%d",*p);
else
printf("incorrect value!");
}
else
printf("please input a integer 0~9!");
}
----------------解决方案--------------------------------------------------------
lz加油啊..我相信你可以改对的啊.
----------------解决方案--------------------------------------------------------
帮你加油.
----------------解决方案--------------------------------------------------------
谢谢了!改过来了。
两个地方:第一个:定义指针数组那里改成:void *(* pfun[2])(int);这样才是数组元素是指向返回值是指针的函数指针的数组。。。(真绕,怎么说才好),写成void (* pfun[2])(int);这样是一个函数指针数组,元素指向无返回值的带一个参数的函数。
这是编译错误。
第二个,就像楼上说的,signal是一个库函数,呵呵,我改成signals了。。。
这是链接错误。
不过昨天写的那个就是signal,编译,链接都没有错,难道是返回值,参数和那个库函数都一样,被改写了?搞不明白。。。
不管怎么说谢谢大家!我会常来的!!
----------------解决方案--------------------------------------------------------
LZ加油啊``复杂声明弄得满不错的``
----------------解决方案--------------------------------------------------------