鱼C论坛

 找回密码
 立即注册
查看: 2391|回复: 6

C语言问题

[复制链接]
发表于 2012-2-19 11:16:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
程序如下:
#include<stdio.h>

int main()
{
        int a,b,x;

        int max(int,int);

        int min(int,int);

        int sum(int,int);

        void sub(int,int,int (*fun)())
       
    sub(a,b,max);

    sub(a,b,min);

        sub(a,b,sum);

        return 0;
}

int max(int x1,int y1)
{
        int max;

        if(x1>y1)
                max=x1;
        else
                max=y1;
        return max;
}

int min(int x2,int y2)
{
        int min;

        if(x2<y2)
                min=x2;
        else
                min=y2;
       
        return min;
}

int sum(int x3,int y3)
{
        int sum;

        sum=x3+y3;

        return sum;
}

void sub(int x,int y,int (*fun)())
{

   
        printf("%d\n",(*fun)(x,y));

       
}
编译器就报出:
--------------------Configuration: 三次调用2 - Win32 Debug--------------------
Compiling...
三次调用2.cpp
e:\作业\练习\函数指针\三次调用2.cpp(15) : error C2146: syntax error : missing ';' before identifier 'sub'
e:\作业\练习\函数指针\三次调用2.cpp(15) : error C2664: 'sub' : cannot convert parameter 3 from 'int (int,int)' to 'int (__cdecl *)(void)'
        None of the functions with this name in scope match the target type
e:\作业\练习\函数指针\三次调用2.cpp(17) : error C2664: 'sub' : cannot convert parameter 3 from 'int (int,int)' to 'int (__cdecl *)(void)'
        None of the functions with this name in scope match the target type
e:\作业\练习\函数指针\三次调用2.cpp(19) : error C2664: 'sub' : cannot convert parameter 3 from 'int (int,int)' to 'int (__cdecl *)(void)'
        None of the functions with this name in scope match the target type
e:\作业\练习\函数指针\三次调用2.cpp(60) : error C2197: 'int (__cdecl *)(void)' : too many actual parameters
Error executing cl.exe.

三次调用2.obj - 5 error(s), 0 warning(s)

而如果这样写程序:
#include<stdio.h>

int main()
{
        int a,b,x;

        int max(int,int);

        int min(int,int);

        int sum(int,int);

        void sub(int,int,int (*fun)(int,int));
       
    sub(a,b,max);

    sub(a,b,min);

        sub(a,b,sum);

        return 0;
}

int max(int x1,int y1)
{
        int max;

        if(x1>y1)
                max=x1;
        else
                max=y1;
        return max;
}

int min(int x2,int y2)
{
        int min;

        if(x2<y2)
                min=x2;
        else
                min=y2;
       
        return min;
}

int sum(int x3,int y3)
{
        int sum;

        sum=x3+y3;

        return sum;
}

void sub(int x,int y,int (*fun)(int,int))
{

   
        printf("%d\n",(*fun)(x,y));

       
}
这样是正确的!

问题:
函数指针在定义是需要说明参数个数和参数类型吗?如果是,那么遇到有不同个数的参数或参数类型又该如何调用呢?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-19 11:27:29 | 显示全部楼层
不同调用会报错的
函数需要首地址和参数说明才能调用
一般都是用函数指针数组构成个函数表操作方便
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-19 21:28:59 | 显示全部楼层
谢谢你的回复,不过这个题是鱼C光盘C指针第7节的一个思考题,小甲鱼老师用的是第一种方式的函数指针的调用,能编译啊!我就纳闷了,为啥我就不行!一定是我sub()函数定义的不对!因为这是老师没有公布的代码!我还是不懂!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-19 21:32:23 | 显示全部楼层
  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int a,b,x;
  5.        
  6.         int max(int,int);
  7.        
  8.         int min(int,int);
  9.        
  10.         int sum(int,int);
  11.        
  12.         //void sub(int,int,int (*fun)())
  13.         void sub(int,int,int (*fun)());
  14.         
  15.                 sub(a,b,max);
  16.        
  17.     sub(a,b,min);
  18.        
  19.         sub(a,b,sum);
  20.        
  21.         return 0;
  22. }

  23. int max(int x1,int y1)
  24. {
  25.         int max;
  26.        
  27.         if(x1>y1)
  28.                 max=x1;
  29.         else
  30.                 max=y1;
  31.         return max;
  32. }

  33. int min(int x2,int y2)
  34. {
  35.         int min;
  36.        
  37.         if(x2<y2)
  38.                 min=x2;
  39.         else
  40.                 min=y2;
  41.        
  42.         return min;
  43. }

  44. int sum(int x3,int y3)
  45. {
  46.         int sum;
  47.        
  48.         sum=x3+y3;
  49.        
  50.         return sum;
  51. }

  52. void sub(int x,int y,int (*fun)())
  53. {
  54.        
  55.    
  56.         printf("%d\n",(*fun)(x,y));
  57.        
  58.        
  59. }
复制代码
见main函数中注释的那行,漏了分号,或者你漏抄了?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-2-20 21:49:29 | 显示全部楼层
:Q还是不行!如果你的能编译!那可能是编译器的问题了!!我复制了你的代码,报了4个错误!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-2-20 22:48:46 | 显示全部楼层
你代码没问题 你说不同类型不同返回值函数指针怎么调用  那你就定义不同类型函数指针就行了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2015-8-17 07:57:57 | 显示全部楼层
咱们码农有力量,嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-20 20:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表