| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1091 人关注过本帖
标题:想不明白的问题,请大家帮忙看一下。
只看楼主 加入收藏
glee_1218
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-3-15
收藏
 问题点数:0 回复次数:9 
想不明白的问题,请大家帮忙看一下。
随便写着玩的程序。想定义个函数指针数组,根据需要调用不同的函数,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!");
}
搜索更多相关主题的帖子: void include return 
2008-03-15 20:45
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你的程序想改不容易啊..呵呵...你自己好好改啊..返回指针是null可能引发异常..指向函数的指针..

学习需要安静。。海盗要重新来过。。
2008-03-15 20:51
glee_1218
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-3-15
收藏
得分:0 
回复 2# 的帖子
是不是指针数组定义错了?
我都快糊涂了。。。
2008-03-15 20:54
glee_1218
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-3-15
收藏
得分:0 
原来写的程序,编译,运行都没有问题的,我想改一下,换一种方法实现,结果就。。。
这是昨天写的,和刚才那个功能一样,这个就没有问题,出错的那个改了一下参数,多定义了一个函数指针数组,到底怎么回事,为什么编译出错?
/*本程序的功能是通过输入调用相应的函数,求下标对应的元素值,或者下标模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);
   }
}

2008-03-15 20:58
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
return (*pfun[sig-1])(num);}
个人感觉这表达式返回的是一个函数返回值,而不是一个指针,另外signal函数是库函数

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-03-15 21:11
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
不好意思..我怀疑编译器不认识...
程序很难理解的..最好不呀袄用啊
#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!");
}

学习需要安静。。海盗要重新来过。。
2008-03-15 21:13
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
lz加油啊..我相信你可以改对的啊.

学习需要安静。。海盗要重新来过。。
2008-03-15 21:22
xianshizhe111
Rank: 1
等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
收藏
得分:0 
帮你加油.
2008-03-15 21:28
glee_1218
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2008-3-15
收藏
得分:0 
谢谢了!改过来了。
两个地方:
第一个:定义指针数组那里改成:void *(* pfun[2])(int);这样才是数组元素是指向返回值是指针的函数指针的数组。。。(真绕,怎么说才好),写成void (* pfun[2])(int);这样是一个函数指针数组,元素指向无返回值的带一个参数的函数。
这是编译错误。
第二个,就像楼上说的,signal是一个库函数,呵呵,我改成signals了。。。
这是链接错误。
不过昨天写的那个就是signal,编译,链接都没有错,难道是返回值,参数和那个库函数都一样,被改写了?搞不明白。。。

不管怎么说谢谢大家!我会常来的!!
2008-03-15 21:39
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
LZ加油啊``复杂声明弄得满不错的``

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2008-03-15 21:54
快速回复:想不明白的问题,请大家帮忙看一下。
数据加载中...
 
   



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

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