函数指针下浮点数怎么设置?
s1e30动动手最后一题:. 请编写一个程序,要求用户输入两个数,分别计算它们加减乘除的结果。:
请确保你的代码符合下面要求:
加减乘除分别由四个函数实现:add、sub、mul 和 divi
定义一个函数指针数组指向上面四个函数
只能通过函数指针的形式访问上面四个函数
需要支持浮点数,注意除数不能为 0
根据题目要求使用函数指针调用不同的函数。在编程过程中发现,使用函数指针调用的时候就会提示%f格式错误,直接调用函数进行输出进行测试没有问题。百度没有找到解决方法,求助怎么设置?
#include<stdio.h>
float sum(float,float);
float sum(float a,float b)
{
return a+b;
}
int main()
{
float num1,num2;
float (*cacl)(float,float);;
printf("请输入两个数字");
scanf("%f %f",&num1,&num2);
cacl=sum;
printf("sum =%.2f\n",cacl);
return 0;
}
#include <stdio.h>
//float sum(float, float); // 没有必要
float sum(float a, float b) {return a + b;}
int main(void) {
float num1, num2;
float (*cacl)(float, float);
//; 多了一个分号
printf("请输入两个数字");
//scanf("%f %f", &num1, &num2); // 有没有空格都行
scanf("%f%f", &num1, &num2);
cacl = sum;
//printf("sum =%.2f\n", cacl); // 这个不是调用函数
printf("sum =%.2f\n", cacl(num1, num2));
return 0;
}
人造人 发表于 2022-11-20 11:26
谢谢,已经能够通过编译了,只是还不明白错在哪里。 顶级太阳 发表于 2022-11-20 11:40
谢谢,已经能够通过编译了,只是还不明白错在哪里。
//printf("sum =%.2f\n", cacl); // 这个不是调用函数 楼主对函数指针理解不够深刻啊,我说下我自己的理解:
float (*cacl)(float, float);
我们知道括号的优先级最大,所以cacl先和“*”结合,表明cacl是个指针,然后和右边的函数(圆括号表示函数)结合,表明该指针是个函数指针,函数指针也是一个指针,只不过该指针指向的是一个函数,即指针变量cacl里存储的是函数的地址,把函数名sum赋值给cacl,就是把该函数在内存中的起始地址给了cacl(和数组名一样,名字的值是个地址,函数是实现某种功能的程序块,函数的起始地址就是该程序块从这个起始地址开始执行的),cacl指向了函数sum的入口,调用指针变量cacl,其实就是调用cacl所指向的函数sum,sum函数有两个参数,所以调用cacl时要传递两个参数,编译器在编译时自会把sum的值替换cacl 人造人 发表于 2022-11-20 12:19
//printf("sum =%.2f\n", cacl); // 这个不是调用函数
帮我看下我上面的理解对不对{:10_250:} 竹逸 发表于 2022-11-20 13:21
楼主对函数指针理解不够深刻啊,我说下我自己的理解:
float (*cacl)(float, float);
我们知道括号的优先 ...
其他都没问题,只有最后一句
你说编译的时候自动替换,其实不是这样的
是先读取calc这个变量里面保存的地址,然后转到这个地址执行
cacl = sum;
11bd: 48 8d 05 95 ff ff ff leaq -0x6b(%rip),%rax # 1159 <sum>
11c4: 48 89 45 f0 movq %rax,-0x10(%rbp)
//printf("sum =%.2f\n", cacl); // 这个不是调用函数
printf("sum =%.2f\n", cacl(num1, num2));
11c8: f3 0f 10 45 ec movss-0x14(%rbp),%xmm0
11cd: 8b 45 e8 movl -0x18(%rbp),%eax
11d0: 48 8b 55 f0 movq -0x10(%rbp),%rdx
11d4: 0f 28 c8 movaps %xmm0,%xmm1
11d7: 66 0f 6e c0 movd %eax,%xmm0
11db: ff d2 callq*%rdx
11dd: 66 0f ef d2 pxor %xmm2,%xmm2
11e1: f3 0f 5a d0 cvtss2sd %xmm0,%xmm2
11e5: 66 48 0f 7e d0 movq %xmm2,%rax
11ea: 66 48 0f 6e c0 movq %rax,%xmm0
11ef: 48 8d 05 29 0e 00 00 leaq 0xe29(%rip),%rax # 201f <_IO_stdin_used+0x1f>
11f6: 48 89 c7 movq %rax,%rdi
11f9: b8 01 00 00 00 movl $0x1,%eax
11fe: e8 3d fe ff ff callq1040 <printf@plt>
人造人 发表于 2022-11-20 13:32
其他都没问题,只有最后一句
你说编译的时候自动替换,其实不是这样的
是先读取calc这个变量里面保存的 ...
对,我表达有误,你这说法更准确{:10_254:} 本帖最后由 竹逸 于 2022-11-20 13:56 编辑
人造人 发表于 2022-11-20 13:32
其他都没问题,只有最后一句
你说编译的时候自动替换,其实不是这样的
是先读取calc这个变量里面保存的 ...
函数指针是不是就是该代码段的偏移地址?以汇编的角度我是这么理解的{:10_258:} 竹逸 发表于 2022-11-20 13:49
函数指针是不是就是该代码段的偏移地址?以汇编的角度我是这么理解的
是的
页:
[1]