c语言函数指针和指针函数的问题
按函数指针的课后习题改的,编译能过,运行时会跳出问题,非常疑惑
直接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;
}
本帖最后由 bin554385863 于 2019-12-5 13:00 编辑
小冥冥 发表于 2019-12-5 12:48
都不懂的话不如等待一个会的,而不是来这里跟我口嗨
指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
#include <stdio.h>
float add(float a, float b)//计算加法
{
return a + b;
}
float sub(float a, float b)//计算减法
{
return a - b;
}
float mul(float a, float b)//计算乘法
{
return a * b;
}
float div(float a, float b)//计算除法
{
return a / b;
}
float (*sellect(char op))(float, float)//返回指定类型的函数指针
{
float (*funcptr)(float, float);
switch (op)
{
case '+':
funcptr = add;
break;
case '-':
funcptr = sub;
break;
case '*':
funcptr = mul;
break;
case '/':
funcptr = div;
break;
}
return funcptr;
}
float calc(float a, char op, float b, float (*funcptr)(float, float))//计算函数
{
funcptr = sellect(op);
return funcptr(a, b);
}
int main(int argc, char const *argv[])
{
float a = 5, b = 7;
char s = '+';
float (*funcptr)(float, float);
calc(a, s, b, funcptr);
printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
s = '-';
calc(a, s, b, funcptr);
printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
s = '*';
calc(a, s, b, funcptr);
printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
s = '/';
calc(a, s, b, funcptr);
printf("%.2f %c %.2f = %.2f\n", a, s, b, calc(a, s, b, funcptr));
return 0;
}
================================================
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> a1163675107 发表于 2019-12-3 23:59
提问的时候注意姿势,这么长一串代码一个注释都没有..
这个是小甲鱼课上的代码....
小冥冥 发表于 2019-12-4 15:17
这个是小甲鱼课上的代码....
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说明你根本没有看懂这个代码的逻辑 想要作业,能给我份吗,给你红包 bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...
对不起,没想到这话戳你G点了,我这些都看得懂,这个程序在我看来printf级别基础的,觉得不需要写注释的.抱歉.
bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...
哦对了,书上我也学,也有的 bin554385863 发表于 2019-12-4 15:54
所以你就不写注释了?不是所有人都是跟着视频学习的,比如我就是买的实体书自学!
你要是注释都写不出来,说 ...
如果你有书都还不知道这个代码,还来这里口嗨,那就有点意思了哦,我只是想解决问题而已.
18113397842 发表于 2019-12-4 22:46
想要作业,能给我份吗,给你红包
你也学到这里来了吗?
太难搞这部分了 #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;
} 本帖最后由 bin554385863 于 2019-12-5 12:53 编辑
小冥冥 发表于 2019-12-5 09:16
对不起,没想到这话戳你G点了,我这些都看得懂,这个程序在我看来printf级别基础的,觉得不需要写注释的.抱歉 ...
用我给你发一份C/C++ primer第六版电子版么,好好看一看有没有这个代码?
既然看懂了,还会有疑惑?
论坛提问规范不是给你看的? 麻烦大佬别气了,能解答的话帮忙看一下,谢谢大佬了。
不然就也别不懂装懂了
都不懂的话不如等待一个会的,而不是来这里跟我口嗨
bin554385863 发表于 2019-12-3 19:48
指出你不写注释就口嗨?
厉害啊,我竟无言以对!!!NX
自己对比一下哪里有问题
不愧是大佬,冒犯了,我这个先设你为正确答案,希望能解释下我的那个的错误原因,我有另开一个帖子,我这个代码设计为能由用户自由输入并计算例如我输入3+5便显示3+5=8(这里我拿整形举个例子),输入3-5便显示3-5=-2,我在代码后面有补充,我直接复制fp=add是可以实现的,但是采用函数指针为返回值却出现问题,希望能解释下这个,您这个代码我是知道的,相当于我那个直接赋值,是可以运行的 小冥冥 发表于 2019-12-5 13:04
不愧是大佬,冒犯了,我这个先设你为正确答案,希望能解释下我的那个的错误原因,我有另开一个帖子,我这 ...
既然大姐头指出问题所在了,我也就不班门弄斧了。
其实,加注释是个好习惯,写注释的时候就顺便把代码检查了。而且等你代码多的时候后不写注释,时间长了自己都会不知道自己写的啥意思!
页:
[1]