鱼C论坛

 找回密码
 立即注册
查看: 3735|回复: 12

想用参数型函数指针自己控制运行加法或者减法,但是有一个地方实现不了。

[复制链接]
发表于 2017-12-4 10:24:21 | 显示全部楼层 |阅读模式

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

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

x
我写的代码如下
#include <iostream>
#include <cstdlib>
using namespace std;

int add(int, int);
int sub(int, int);
int Math(int a, int b, int(*pAdd)(int, int));

void main() 
{
        int a = 3;
        int b = 2;
        char str[3];
        printf("加法(add)  或者 减法(sub)");
        scanf_s("%s", str);
        cout << Math(a, b, *str) << endl;
        //cout << Math(a, b, sub) << endl;

        system("pause");
}

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

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

int Math(int a, int b, int(*pAdd)(int, int))
{
        return (*pAdd)(a, b);
}

cout << Math(a, b, *str) << endl; 这一行报错了
该怎么通过自己输入add or sub来控制执行的运算呢???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-4 10:38:16 | 显示全部楼层

回帖奖励 +5 鱼币

这样传递肯定不对,你需要的是一个函数指针,而不是一个数组名
你可以参考小甲鱼老师的讲解:
http://bbs.fishc.com/thread-77586-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-4 11:16:03 | 显示全部楼层
本帖最后由 yuanyangxin 于 2017-12-4 11:21 编辑
BngThea 发表于 2017-12-4 10:38
这样传递肯定不对,你需要的是一个函数指针,而不是一个数组名
你可以参考小甲鱼老师的讲解:
http://bbs ...

#include <iostream>
#include <cstdlib>
using namespace std;

int add(int, int);
int sub(int, int);
int Math(int a, int b, int(*pAdd)(int, int));
int(*select(char op))(int, int);

void main() 
{
                //int a = 3;
                //int b = 2;
                //char op='+';
                //int(*fp)(int, int);
                //printf("加法(add)  或者 减法(sub)");
                //scanf_s("%c", op);

                //fp = select(op);
                //cout << Math(a, b,fp) << endl;
                ////cout << Math(a, b, sub) << endl;

        int num1, num2;
        char op;
        int(*fp)(int, int);

        printf("请输入一个式子(如1+2):");
        scanf_s("%d%c%d", &num1, &op, &num2);

        fp = select(op);
        cout << Math(num1, num2, fp);

        system("pause");
}

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

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

int Math(int a, int b, int(*pAdd)(int, int))
{
        return (*pAdd)(a, b);
}
int(*select(char op))(int, int)
{
        switch (op)
        {
                case '+':return add;
                case '-':return sub;
        }
}

你好,我按照小甲鱼老师的代码进行了上面的更改,但是依旧会报错
写入位置时发生访问冲突。上传不了报错信息的图片,麻烦你帮我看一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 11:20:13 | 显示全部楼层
yuanyangxin 发表于 2017-12-4 11:16
你好,我按照小甲鱼老师的代码进行了上面的更改,但是依旧会报错
写入位置时发生访问冲突。 具体报 ...

报错信息在哪?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-4 11:22:38 | 显示全部楼层
BngThea 发表于 2017-12-4 11:20
报错信息在哪?

马上,我手打给你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-4 11:24:24 | 显示全部楼层
BngThea 发表于 2017-12-4 11:20
报错信息在哪?

scan_f:格式化字符串“%c”需要类型“unsigned int”的参数,但可变参数3拥有了类型int
scan_f:没有为格式字符串传递足够的参数
select:不是所有的控件路径都返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-4 11:27:30 | 显示全部楼层
本帖最后由 yuanyangxin 于 2017-12-4 11:30 编辑
#include <iostream>
#include <cstdlib>
#include<stdio.h>
using namespace std;

int add(int, int);
int sub(int, int);
int Math(int a, int b, int(*pAdd)(int, int));
int(*select(char op))(int, int);

void main() 
{
        int num1, num2;
        char op;
        int(*fp)(int, int);

        printf("请输入一个式子(如1+2):");
        scanf_s("%d%c%d", &num1, &op, &num2);

        fp = select(op);
        cout << Math(num1, num2, fp);

        system("pause");
}

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

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

int Math(int a, int b, int(*pAdd)(int, int))
{
        return (*pAdd)(a, b);
}
int(*select(char op))(int, int)
{
        switch (op)
        {
                case '+':return add;
                case '-':return sub;
        }
}

报错是在我输入了1+2后弹出来这个窗口的
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-4 12:45:56 | 显示全部楼层
yuanyangxin 发表于 2017-12-4 11:27
报错是在我输入了1+2后弹出来这个窗口的

1+2中间要用空格隔开
1 + 2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-4 17:29:03 | 显示全部楼层
BngThea 发表于 2017-12-4 12:45
1+2中间要用空格隔开
1 + 2

对不起啊,还是报错了。麻烦您帮我看一下
2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-5 19:28:56 | 显示全部楼层

回帖奖励 +5 鱼币

两种解决方法:
1.用scanf关闭安全检查,可以。
2.scanf_s("%d%c%d", &num1,&op,1,&num2);字符型用scanf_s的话需要输入长度控制,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 13:09:55 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-21 14:06:33 | 显示全部楼层

回帖奖励 +5 鱼币

<<   >>   这些是什么符号??还有这种的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 16:27:21 | 显示全部楼层
1809228982 发表于 2018-12-21 14:06
>   这些是什么符号??还有这种的?

原本这两个符号是左移右移运算符,但在C++中这两个运算符被重载了有了新的作用,具体学到了C++再自己学习。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-1 00:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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