凌光 发表于 2012-2-19 11:16:14

C语言问题

程序如下:
#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));

       
}
这样是正确的!

问题:
函数指针在定义是需要说明参数个数和参数类型吗?如果是,那么遇到有不同个数的参数或参数类型又该如何调用呢?

ccqiji 发表于 2012-2-19 11:27:29

不同调用会报错的
函数需要首地址和参数说明才能调用
一般都是用函数指针数组构成个函数表操作方便

凌光 发表于 2012-2-19 21:28:59

谢谢你的回复,不过这个题是鱼C光盘C指针第7节的一个思考题,小甲鱼老师用的是第一种方式的函数指针的调用,能编译啊!我就纳闷了,为啥我就不行!一定是我sub()函数定义的不对!因为这是老师没有公布的代码!我还是不懂!!

仰望天上的光 发表于 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函数中注释的那行,漏了分号,或者你漏抄了?

凌光 发表于 2012-2-20 21:49:29

:Q还是不行!如果你的能编译!那可能是编译器的问题了!!我复制了你的代码,报了4个错误!!

ccqiji 发表于 2012-2-20 22:48:46

你代码没问题 你说不同类型不同返回值函数指针怎么调用那你就定义不同类型函数指针就行了

智商是硬伤 发表于 2015-8-17 07:57:57

{:7_146:}咱们码农有力量,嘿{:7_146:}
页: [1]
查看完整版本: C语言问题