搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2015-4-1 21:10:39 | 显示全部楼层 |阅读模式
本帖最后由 sj1125055001 于 2015-4-1 21:12 编辑

目的是想利用函数指针数组的指针
但是在赋值的时候出错(红色标注的)
#include<stdio.h>
int (*(*FunArray[4]))(int,int);
int (*fun[1][4])(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[0][0]=add;
        fun[0][1]=sub;
        fun[0][2]=mul;
        fun[0][3]=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[FunFlag-1](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;
}

本帖子中包含更多资源

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

x

出0入8汤圆

发表于 2015-4-1 21:21:46 来自手机 | 显示全部楼层
编译器不是告诉你了么
那玩意不是l-value
楼主没学过英语?

出0入0汤圆

发表于 2015-4-1 22:43:52 | 显示全部楼层
用typedef好懂一些
typedef int (*pFun)(int,int);//声明新的类型
pFun FunArray[4];//用新声明的类型创建 一个函指数组

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

            
void main(void)
{
   FunArray[0]=add;
   FunArray[1]=sub;
   FunArray[2]=mul;
   FunArray[3]=div;
}

出0入0汤圆

发表于 2015-4-1 23:12:14 来自手机 | 显示全部楼层
楼上正解,要不然真的很容易弄错的。

出0入0汤圆

发表于 2015-4-1 23:44:20 | 显示全部楼层
FunArray[0]=*fun;  你的错误就没了
但是又出现新的bug了

出0入0汤圆

发表于 2015-4-1 23:49:38 | 显示全部楼层
本帖最后由 磊磊映画 于 2015-4-1 23:59 编辑

楼主 ,完美解决你的问题

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


上代码
#include<stdio.h>
int (*(*FunArray[4]))(int,int);
int (*fun[1][4])(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[0][0]=add;
        fun[0][1]=sub;
        fun[0][2]=mul;
        fun[0][3]=div;

        FunArray[0]=*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[0][FunFlag-1](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


出0入0汤圆

发表于 2015-4-1 23:58:28 | 显示全部楼层
本帖最后由 磊磊映画 于 2015-4-2 00:01 编辑

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


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

出0入0汤圆

 楼主| 发表于 2015-4-2 09:52:28 | 显示全部楼层
磊磊映画 发表于 2015-4-1 23:58
修改的三个地方第四个是问题
1. FunArray=fun;    改成了FunArray[0]=*fun;
FunArray是个函数指针数组  必 ...

至于你说的第三点
这是我这个程序的
我是在这个程序上的基础上,想试试函数指针数组指针
才出现了个本帖中的程序
#include<stdio.h>
int (*fun[4])(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[0]=add;
        fun[1]=sub;
        fun[2]=mul;
        fun[3]=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[FunFlag-1](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;
}

出0入0汤圆

发表于 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。让它实时处理最重要的任务
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 23:46

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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