鱼C论坛

 找回密码
 立即注册
查看: 2224|回复: 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));

       
}
这样是正确的!

问题:
函数指针在定义是需要说明参数个数和参数类型吗?如果是,那么遇到有不同个数的参数或参数类型又该如何调用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-19 11:27:29 | 显示全部楼层
不同调用会报错的
函数需要首地址和参数说明才能调用
一般都是用函数指针数组构成个函数表操作方便
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-19 21:28:59 | 显示全部楼层
谢谢你的回复,不过这个题是鱼C光盘C指针第7节的一个思考题,小甲鱼老师用的是第一种方式的函数指针的调用,能编译啊!我就纳闷了,为啥我就不行!一定是我sub()函数定义的不对!因为这是老师没有公布的代码!我还是不懂!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-19 21:32:23 | 显示全部楼层
#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)())
        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));
        
        
}
见main函数中注释的那行,漏了分号,或者你漏抄了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-20 21:49:29 | 显示全部楼层
:Q还是不行!如果你的能编译!那可能是编译器的问题了!!我复制了你的代码,报了4个错误!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-20 22:48:46 | 显示全部楼层
你代码没问题 你说不同类型不同返回值函数指针怎么调用  那你就定义不同类型函数指针就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2015-8-17 07:57:57 | 显示全部楼层
咱们码农有力量,嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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