鱼C论坛

 找回密码
 立即注册
查看: 2386|回复: 9

[已解决]函数指针下浮点数怎么设置?

[复制链接]
发表于 2022-11-20 11:02:07 | 显示全部楼层 |阅读模式

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

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

x
s1e30动动手最后一题:
. 请编写一个程序,要求用户输入两个数,分别计算它们加减乘除的结果。:
请确保你的代码符合下面要求:

加减乘除分别由四个函数实现:add、sub、mul 和 divi
定义一个函数指针数组指向上面四个函数
只能通过函数指针的形式访问上面四个函数
需要支持浮点数,注意除数不能为 0

根据题目要求使用函数指针调用不同的函数。在编程过程中发现,使用函数指针调用的时候就会提示%f格式错误,直接调用函数进行输出进行测试没有问题。百度没有找到解决方法,求助怎么设置?

  1. #include<stdio.h>
  2. float sum(float,float);
  3. float sum(float a,float b)
  4. {
  5.         return a+b;
  6. }


  7. int main()
  8. {
  9.         float num1,num2;
  10.         float (*cacl)(float,float);;

  11.         printf("请输入两个数字");
  12.         scanf("%f %f",&num1,&num2);
  13.         cacl=sum;

  14.         printf("sum =%.2f\n",cacl);

  15. return 0;
  16. }
复制代码


屏幕截图 2022-11-20 105657.jpg
最佳答案
2022-11-20 11:26:01
  1. #include <stdio.h>

  2. //float sum(float, float);      // 没有必要
  3. float sum(float a, float b) {return a + b;}

  4. int main(void) {
  5.     float num1, num2;
  6.     float (*cacl)(float, float);
  7.     //;     多了一个分号

  8.     printf("请输入两个数字");
  9.     //scanf("%f %f", &num1, &num2);     // 有没有空格都行
  10.     scanf("%f%f", &num1, &num2);
  11.     cacl = sum;

  12.     //printf("sum =%.2f\n", cacl);      // 这个不是调用函数
  13.     printf("sum =%.2f\n", cacl(num1, num2));

  14.     return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-20 11:26:01 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

  2. //float sum(float, float);      // 没有必要
  3. float sum(float a, float b) {return a + b;}

  4. int main(void) {
  5.     float num1, num2;
  6.     float (*cacl)(float, float);
  7.     //;     多了一个分号

  8.     printf("请输入两个数字");
  9.     //scanf("%f %f", &num1, &num2);     // 有没有空格都行
  10.     scanf("%f%f", &num1, &num2);
  11.     cacl = sum;

  12.     //printf("sum =%.2f\n", cacl);      // 这个不是调用函数
  13.     printf("sum =%.2f\n", cacl(num1, num2));

  14.     return 0;
  15. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-20 11:40:38 | 显示全部楼层

谢谢,已经能够通过编译了,只是还不明白错在哪里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 12:19:08 | 显示全部楼层
顶级太阳 发表于 2022-11-20 11:40
谢谢,已经能够通过编译了,只是还不明白错在哪里。

    //printf("sum =%.2f\n", cacl);      // 这个不是调用函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 13:21:03 From FishC Mobile | 显示全部楼层
楼主对函数指针理解不够深刻啊,我说下我自己的理解:
float (*cacl)(float, float);
我们知道括号的优先级最大,所以cacl先和“*”结合,表明cacl是个指针,然后和右边的函数(圆括号表示函数)结合,表明该指针是个函数指针,函数指针也是一个指针,只不过该指针指向的是一个函数,即指针变量cacl里存储的是函数的地址,把函数名sum赋值给cacl,就是把该函数在内存中的起始地址给了cacl(和数组名一样,名字的值是个地址,函数是实现某种功能的程序块,函数的起始地址就是该程序块从这个起始地址开始执行的),cacl指向了函数sum的入口,调用指针变量cacl,其实就是调用cacl所指向的函数sum,sum函数有两个参数,所以调用cacl时要传递两个参数,编译器在编译时自会把sum的值替换cacl
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 13:23:04 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-11-20 12:19
//printf("sum =%.2f\n", cacl);      // 这个不是调用函数

帮我看下我上面的理解对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 13:32:17 | 显示全部楼层
竹逸 发表于 2022-11-20 13:21
楼主对函数指针理解不够深刻啊,我说下我自己的理解:
float (*cacl)(float, float);
我们知道括号的优先 ...

其他都没问题,只有最后一句
你说编译的时候自动替换,其实不是这样的
是先读取calc这个变量里面保存的地址,然后转到这个地址执行

  1.     cacl = sum;
  2.     11bd:       48 8d 05 95 ff ff ff    leaq   -0x6b(%rip),%rax        # 1159 <sum>
  3.     11c4:       48 89 45 f0             movq   %rax,-0x10(%rbp)

  4.     //printf("sum =%.2f\n", cacl);      // 这个不是调用函数
  5.     printf("sum =%.2f\n", cacl(num1, num2));
  6.     11c8:       f3 0f 10 45 ec          movss  -0x14(%rbp),%xmm0
  7.     11cd:       8b 45 e8                movl   -0x18(%rbp),%eax
  8.     11d0:       48 8b 55 f0             movq   -0x10(%rbp),%rdx
  9.     11d4:       0f 28 c8                movaps %xmm0,%xmm1
  10.     11d7:       66 0f 6e c0             movd   %eax,%xmm0
  11.     11db:       ff d2                   callq  *%rdx
  12.     11dd:       66 0f ef d2             pxor   %xmm2,%xmm2
  13.     11e1:       f3 0f 5a d0             cvtss2sd %xmm0,%xmm2
  14.     11e5:       66 48 0f 7e d0          movq   %xmm2,%rax
  15.     11ea:       66 48 0f 6e c0          movq   %rax,%xmm0
  16.     11ef:       48 8d 05 29 0e 00 00    leaq   0xe29(%rip),%rax        # 201f <_IO_stdin_used+0x1f>
  17.     11f6:       48 89 c7                movq   %rax,%rdi
  18.     11f9:       b8 01 00 00 00          movl   $0x1,%eax
  19.     11fe:       e8 3d fe ff ff          callq  1040 <printf@plt>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 13:38:56 From FishC Mobile | 显示全部楼层
人造人 发表于 2022-11-20 13:32
其他都没问题,只有最后一句
你说编译的时候自动替换,其实不是这样的
是先读取calc这个变量里面保存的 ...

对,我表达有误,你这说法更准确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 13:49:04 From FishC Mobile | 显示全部楼层
本帖最后由 竹逸 于 2022-11-20 13:56 编辑
人造人 发表于 2022-11-20 13:32
其他都没问题,只有最后一句
你说编译的时候自动替换,其实不是这样的
是先读取calc这个变量里面保存的 ...


函数指针是不是就是该代码段的偏移地址?以汇编的角度我是这么理解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-20 14:00:25 | 显示全部楼层
竹逸 发表于 2022-11-20 13:49
函数指针是不是就是该代码段的偏移地址?以汇编的角度我是这么理解的

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 10:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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