鱼C论坛

 找回密码
 立即注册
查看: 1168|回复: 15

[已解决]c语言函数指针和指针函数的问题

[复制链接]
发表于 2019-12-3 19:48:54 | 显示全部楼层 |阅读模式
10鱼币

按函数指针的课后习题改的,编译能过,运行时会跳出问题,非常疑惑
直接fp=add等是可以运行的
#include<stdio.h>
float add(float, float);
float sub(float, float);
float mul(float, float);
float chu(float, float);
float (*sellect(char op))(float, float);
float calc(float*fp(float,float),float ,float);

float add(float num1, float num2)
{
        return num1 + num2;
}

float sub(float num1, float num2)
{
        return num1 - num2;
}

float mul(float num1, float num2)
{
        return num1 * num2;
}

float chu(float num1, float num2)
{
        return num1 / num2;
}
float (*sellect(char op))(float, float)
{
        switch ('op')
        {
        case'+':return add;
        case'-':return sub;
        case'*':return mul;
        case'/':return chu;
        default:
                return 0;
        }
}

float calc(float(* fp)(float, float), float num1, float num2)
{
//        return (*fp)(num1, num2);
}

int main(void)
{
        float num1, num2;
        char op;
        float(*fp)(float,float);
        printf("请输入+-*/的算法式例如(3+5)\n");
        scanf("%f%c%f",&num1,&op,&num2);
        fp = sellect(op);

        printf("%f%c%f=%f", num1, op, num2,(*fp)(num1,num2));//在本行跳出0x00000000 处(位于 Project1.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突
        return 0;
}
最佳答案
2019-12-3 19:48:55
本帖最后由 bin554385863 于 2019-12-5 13:00 编辑
小冥冥 发表于 2019-12-5 12:48
都不懂的话不如等待一个会的,而不是来这里跟我口嗨


指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
  1. #include <stdio.h>
  2. float add(float a, float b)//计算加法
  3. {
  4.     return a + b;
  5. }
  6. float sub(float a, float b)//计算减法
  7. {
  8.     return a - b;
  9. }
  10. float mul(float a, float b)//计算乘法
  11. {
  12.     return a * b;
  13. }
  14. float div(float a, float b)//计算除法
  15. {
  16.     return a / b;
  17. }
  18. float (*sellect(char op))(float, float)//返回指定类型的函数指针
  19. {
  20.     float (*funcptr)(float, float);
  21.     switch (op)
  22.     {
  23.     case '+':
  24.         funcptr = add;
  25.         break;
  26.     case '-':
  27.         funcptr = sub;
  28.         break;
  29.     case '*':
  30.         funcptr = mul;
  31.         break;
  32.     case '/':
  33.         funcptr = div;
  34.         break;
  35.     }
  36.     return funcptr;
  37. }
  38. float calc(float a, char op, float b, float (*funcptr)(float, float))//计算函数
  39. {
  40.     funcptr = sellect(op);
  41.     return funcptr(a, b);
  42. }
  43. int main(int argc, char const *argv[])
  44. {
  45.     float a = 5, b = 7;
  46.     char s = '+';
  47.     float (*funcptr)(float, float);
  48.     calc(a, s, b, funcptr);
  49.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  50.     s = '-';
  51.     calc(a, s, b, funcptr);
  52.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  53.     s = '*';
  54.     calc(a, s, b, funcptr);
  55.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  56.     s = '/';
  57.     calc(a, s, b, funcptr);
  58.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  59.     return 0;
  60. }
复制代码

================================================
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-3xhsedah.zwn --stdout=Microsoft-MIEngine-Out-4exwmvoh.unt --stderr=Microsoft-MIEngine-Error-5cj4vc0c.jga --pid=Microsoft-MIEngine-Pid-ckhutod3.xho --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
5.00 + 7.00 = 12.00
5.00 - 7.00 = -2.00
5.00 * 7.00 = 35.00
5.00 / 7.00 = 0.71


E:\Users\admin\Documents\VScode\Code>

最佳答案

查看完整内容

指出你不写注释就口嗨? 厉害啊,我竟无言以对!!!NX ================================================ Microsoft Windows [版本 10.0.18363.476] (c) 2019 Microsoft Corporation。保留所有权利。 E:%users\admin\Documents\VScode\Code>c:%users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-3xhsedah.zwn --stdout=Microsoft-MI ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-3 19:48:55 | 显示全部楼层    本楼为最佳答案   
本帖最后由 bin554385863 于 2019-12-5 13:00 编辑
小冥冥 发表于 2019-12-5 12:48
都不懂的话不如等待一个会的,而不是来这里跟我口嗨


指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
  1. #include <stdio.h>
  2. float add(float a, float b)//计算加法
  3. {
  4.     return a + b;
  5. }
  6. float sub(float a, float b)//计算减法
  7. {
  8.     return a - b;
  9. }
  10. float mul(float a, float b)//计算乘法
  11. {
  12.     return a * b;
  13. }
  14. float div(float a, float b)//计算除法
  15. {
  16.     return a / b;
  17. }
  18. float (*sellect(char op))(float, float)//返回指定类型的函数指针
  19. {
  20.     float (*funcptr)(float, float);
  21.     switch (op)
  22.     {
  23.     case '+':
  24.         funcptr = add;
  25.         break;
  26.     case '-':
  27.         funcptr = sub;
  28.         break;
  29.     case '*':
  30.         funcptr = mul;
  31.         break;
  32.     case '/':
  33.         funcptr = div;
  34.         break;
  35.     }
  36.     return funcptr;
  37. }
  38. float calc(float a, char op, float b, float (*funcptr)(float, float))//计算函数
  39. {
  40.     funcptr = sellect(op);
  41.     return funcptr(a, b);
  42. }
  43. int main(int argc, char const *argv[])
  44. {
  45.     float a = 5, b = 7;
  46.     char s = '+';
  47.     float (*funcptr)(float, float);
  48.     calc(a, s, b, funcptr);
  49.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  50.     s = '-';
  51.     calc(a, s, b, funcptr);
  52.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  53.     s = '*';
  54.     calc(a, s, b, funcptr);
  55.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  56.     s = '/';
  57.     calc(a, s, b, funcptr);
  58.     printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
  59.     return 0;
  60. }
复制代码

================================================
Microsoft Windows [版本 10.0.18363.476]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode\Code>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.2\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-3xhsedah.zwn --stdout=Microsoft-MIEngine-Out-4exwmvoh.unt --stderr=Microsoft-MIEngine-Error-5cj4vc0c.jga --pid=Microsoft-MIEngine-Pid-ckhutod3.xho --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
5.00 + 7.00 = 12.00
5.00 - 7.00 = -2.00
5.00 * 7.00 = 35.00
5.00 / 7.00 = 0.71


E:\Users\admin\Documents\VScode\Code>

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
人造人 + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

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

使用道具 举报

头像被屏蔽
发表于 2019-12-3 23:59:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-4 15:17:26 | 显示全部楼层
a1163675107 发表于 2019-12-3 23:59
提问的时候注意姿势,这么长一串代码一个注释都没有..

这个是小甲鱼课上的代码....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-4 15:54:00 | 显示全部楼层
小冥冥 发表于 2019-12-4 15:17
这个是小甲鱼课上的代码....

所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说明你根本没有看懂这个代码的逻辑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-4 22:46:22 | 显示全部楼层
想要作业[em:9:],能给我份吗,给你红包
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 09:16:47 | 显示全部楼层
bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...

对不起,没想到这话戳你G点了,我这些都看得懂,这个程序在我看来printf级别基础的,觉得不需要写注释的.抱歉.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 09:17:18 | 显示全部楼层
bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...

哦对了,书上我也学,也有的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 09:20:18 | 显示全部楼层
bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...

如果你有书都还不知道这个代码,还来这里口嗨,那就有点意思了哦,我只是想解决问题而已.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 09:21:08 | 显示全部楼层
18113397842 发表于 2019-12-4 22:46
想要作业[em:9:],能给我份吗,给你红包

你也学到这里来了吗?
太难搞这部分了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 09:25:43 | 显示全部楼层
#include<stdio.h>
float add(float, float);
float sub(float, float);
float mul(float, float);
float chu(float, float);//分别是加减乘除计算函数
float (*sellect(char op))(float, float);//挑选函数返回一个带两个float型整型参数的指针函数
float calc(float*fp(float,float),float ,float);//实现直接返回对应指针函数的计算

float add(float num1, float num2)
{
        return num1 + num2;
}

float sub(float num1, float num2)
{
        return num1 - num2;
}

float mul(float num1, float num2)
{
        return num1 * num2;
}

float chu(float num1, float num2)
{
        return num1 / num2;
}
float (*sellect(char op))(float, float)
{
        switch ('op')
        {
        case'+':return add;
        case'-':return sub;
        case'*':return mul;
        case'/':return chu;
        default:
                return 0;
        }
}

float calc(float(* fp)(float, float), float num1, float num2)
{
//        return (*fp)(num1, num2);
}

int main(void)
{
        float num1, num2;
        char op;
        float(*fp)(float,float);//定义了一个带两个浮点型的函数指针
        printf("请输入+-*/的算法式例如(3+5)\n");
        scanf("%f%c%f",&num1,&op,&num2);//输入
        fp = sellect(op);

        printf("%f%c%f=%f", num1, op, num2,(*fp)(num1,num2));//在本行跳出0x00000000 处(位于 Project1.exe 中)引发的异常: 0xC0000005: 执行位置 0x00000000 时发生访问冲突
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-5 12:21:47 | 显示全部楼层
本帖最后由 bin554385863 于 2019-12-5 12:53 编辑
小冥冥 发表于 2019-12-5 09:16
对不起,没想到这话戳你G点了,我这些都看得懂,这个程序在我看来printf级别基础的,觉得不需要写注释的.抱歉 ...


用我给你发一份C/C++ primer第六版电子版么,好好看一看有没有这个代码?
既然看懂了,还会有疑惑?
论坛提问规范不是给你看的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 12:47:32 | 显示全部楼层
麻烦大佬别气了,能解答的话帮忙看一下,谢谢大佬了。
不然就也别不懂装懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 12:48:42 | 显示全部楼层
都不懂的话不如等待一个会的,而不是来这里跟我口嗨
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-5 13:04:46 | 显示全部楼层
bin554385863 发表于 2019-12-3 19:48
指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
自己对比一下哪里有问题

不愧是大佬,冒犯了,我这个先设你为正确答案,希望能解释下我的那个的错误原因,我有另开一个帖子,我这个代码设计为能由用户自由输入并计算例如我输入3+5便显示3+5=8(这里我拿整形举个例子),输入3-5便显示3-5=-2,我在代码后面有补充,我直接复制fp=add是可以实现的,但是采用函数指针为返回值却出现问题,希望能解释下这个,您这个代码我是知道的,相当于我那个直接赋值,是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-5 14:12:41 From FishC Mobile | 显示全部楼层
小冥冥 发表于 2019-12-5 13:04
不愧是大佬,冒犯了,我这个先设你为正确答案,希望能解释下我的那个的错误原因,我有另开一个帖子,我这 ...

既然大姐头指出问题所在了,我也就不班门弄斧了。
其实,加注释是个好习惯,写注释的时候就顺便把代码检查了。而且等你代码多的时候后不写注释,时间长了自己都会不知道自己写的啥意思!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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