鱼C论坛

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

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

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

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

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

x
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;
}

屏幕截图 2022-11-20 105657.jpg
最佳答案
2022-11-20 11:26:01
#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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-20 11:26:01 | 显示全部楼层    本楼为最佳答案   
#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;
}
想知道小甲鱼最近在做啥?请访问 -> 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这个变量里面保存的地址,然后转到这个地址执行
    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          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-12-26 19:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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