sj1125055001 发表于 2015-4-1 21:10:39

求助:函数指针数组的应用问题

本帖最后由 sj1125055001 于 2015-4-1 21:12 编辑

目的是想利用函数指针数组的指针
但是在赋值的时候出错(红色标注的)
#include<stdio.h>
int (*(*FunArray))(int,int);
int (*fun)(int,int);
int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int);

int main()
{
        int FunFlag=0,a,b;
        fun=add;
        fun=sub;
        fun=mul;
        fun=div;

        FunArray=fun;       
//FunArray=&fun;


        while(1)
        {       
                printf("1、加法。\n2、减法。\n3、乘法运算。\n4、除法运算。\n5、退出。\n");
                scanf("%d",&FunFlag);               
                if(FunFlag==5)
                        break;

                printf("输入数据:");
                scanf("%d %d",&a,&b);
                //printf("结果是:%d.\n",fun(a,b));
        }
        printf("sizeof FunArray:%d.\n",sizeof(FunArray));
        printf("sizeof fun:%d.\n",sizeof(fun));
        return 0;
}

int add(int a,int b)
{
        return (a+b);
}

int sub(int a,int b)
{
        return (a-b);
}

int mul(int a,int b)
{
        return (a*b);
}

int div(int a,int b)
{
        if(b!=0)
                return (a/b);
        else
                return b;
}

canspider 发表于 2015-4-1 21:21:46

编译器不是告诉你了么
那玩意不是l-value
楼主没学过英语?

Free_Bird 发表于 2015-4-1 22:43:52

用typedef好懂一些
typedef int (*pFun)(int,int);//声明新的类型
pFun FunArray;//用新声明的类型创建 一个函指数组

int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int);

            
void main(void)
{
   FunArray=add;
   FunArray=sub;
   FunArray=mul;
   FunArray=div;
}

动车组 发表于 2015-4-1 23:12:14

楼上正解,要不然真的很容易弄错的。

磊磊映画 发表于 2015-4-1 23:44:20

FunArray=*fun;你的错误就没了
但是又出现新的bug了

磊磊映画 发表于 2015-4-1 23:49:38

本帖最后由 磊磊映画 于 2015-4-1 23:59 编辑

楼主 ,完美解决你的问题

问你一个问题 FunArray[]是干啥的 感觉没起作用呢 ???


上代码
#include<stdio.h>
int (*(*FunArray))(int,int);
int (*fun)(int,int);
int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int);

int main()
{
      int FunFlag=0,a,b;
      fun=add;
      fun=sub;
      fun=mul;
      fun=div;

      FunArray=*fun;      



      while(1)
      {      
                printf("1、加法。\n2、减法。\n3、乘法运算。\n4、除法运算。\n5、退出。\n");
                scanf("%d",&FunFlag);               
                if(FunFlag==5)
                        break;

                printf("输入数据:");
                scanf("%d,%d",&a,&b);
                printf("结果是:%d\n",fun(a,b));
                                break;
      }
      printf("sizeof FunArray:%d.\n",sizeof(FunArray));
      printf("sizeof fun:%d.\n",sizeof(fun));
      return 0;
}

int add(int a,int b)
{
      return (a+b);
}

int sub(int a,int b)
{
      return (a-b);
}

int mul(int a,int b)
{
      return (a*b);
}

int div(int a,int b)
{
      if(b!=0)
                return (a/b);
      else
                return b;
}


调试界面



1、加法。
2、减法。
3、乘法运算。
4、除法运算。
5、退出。
1
输入数据:1,2
结果是:3
sizeof FunArray:16.
sizeof fun:16.
Press any key to continue


磊磊映画 发表于 2015-4-1 23:58:28

本帖最后由 磊磊映画 于 2015-4-2 00:01 编辑

修改的三个地方第四个是问题
1. FunArray=fun;    改成了FunArray=*fun;
FunArray是个函数指针数组必须指向函数指针类型的数据,指向函数指针的指针数组*运算就是指针
2. break;
while(1)里面最后加了退出,要不一直在打印
3.printf("结果是:%d.\n",fun(a,b));
fun是指向函数指针的指针数组,而且是二维的 楼主缺少一维。
改成printf("结果是:%d.\n",fun(a,b));
实参传入a,b倒是想的挺周全的,要不光指向函数,没用实参传入,怎么执行呢?
4. scanf("%d %d",&a,&b);
怎么看着不习惯?
我一般这么写
   scanf("%d,%d",&a,&b);


在下愚见,有不对的地方还望指教,谢谢
好的,睡觉,各位晚安。

sj1125055001 发表于 2015-4-2 09:52:28

磊磊映画 发表于 2015-4-1 23:58
修改的三个地方第四个是问题
1. FunArray=fun;    改成了FunArray=*fun;
FunArray是个函数指针数组必 ...

至于你说的第三点
这是我这个程序的
我是在这个程序上的基础上,想试试函数指针数组指针
才出现了个本帖中的程序
#include<stdio.h>
int (*fun)(int,int);
int add(int,int);
int sub(int,int);
int mul(int,int);
int div(int,int);

int main()
{
      int FunFlag=0,a,b;
      fun=add;
      fun=sub;
      fun=mul;
      fun=div;



      while(1)
      {      
                printf("1、加法。\n2、减法。\n3、乘法运算。\n4、除法运算。\n5、退出。\n");
                scanf("%d",&FunFlag);               
                if(FunFlag==5)
                        break;

                printf("输入数据:");
                scanf("%d %d",&a,&b);
                printf("结果是:%d.\n",fun(a,b));
      }
      return 0;
}

int add(int a,int b)
{
      return (a+b);
}

int sub(int a,int b)
{
      return (a-b);
}

int mul(int a,int b)
{
      return (a*b);
}

int div(int a,int b)
{
      if(b!=0)
                return (a/b);
      else
                return b;
}

磊磊映画 发表于 2015-4-2 09:57:21

本帖最后由 磊磊映画 于 2015-4-2 10:00 编辑

sj1125055001 发表于 2015-4-2 09:52
至于你说的第三点
这是我这个程序的
我是在这个程序上的基础上,想试试函数指针数组指针


哦,明白了,
1.还是用Fun这个比较好,通过函数指针指向函数指针数组,指针数组再去指向函数。使用函数指针的话抽象的更好,比较上层,与底层隔离更好。
2.不用你这么复杂,不使用函数指针数组,只使用函数指针就能实现状态机了。
你学会函数指针的应用就是实现状态机。
main_state1();
main_state2();
main_state3();
更高效的利用cpu。让它实时处理最重要的任务
页: [1]
查看完整版本: 求助:函数指针数组的应用问题