顶级太阳 发表于 2022-11-20 11:02:07

函数指针下浮点数怎么设置?

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

顶级太阳 发表于 2022-11-20 11:40:38

人造人 发表于 2022-11-20 11:26


谢谢,已经能够通过编译了,只是还不明白错在哪里。

人造人 发表于 2022-11-20 12:19:08

顶级太阳 发表于 2022-11-20 11:40
谢谢,已经能够通过编译了,只是还不明白错在哪里。

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

竹逸 发表于 2022-11-20 13:21:03

楼主对函数指针理解不够深刻啊,我说下我自己的理解:
float (*cacl)(float, float);
我们知道括号的优先级最大,所以cacl先和“*”结合,表明cacl是个指针,然后和右边的函数(圆括号表示函数)结合,表明该指针是个函数指针,函数指针也是一个指针,只不过该指针指向的是一个函数,即指针变量cacl里存储的是函数的地址,把函数名sum赋值给cacl,就是把该函数在内存中的起始地址给了cacl(和数组名一样,名字的值是个地址,函数是实现某种功能的程序块,函数的起始地址就是该程序块从这个起始地址开始执行的),cacl指向了函数sum的入口,调用指针变量cacl,其实就是调用cacl所指向的函数sum,sum函数有两个参数,所以调用cacl时要传递两个参数,编译器在编译时自会把sum的值替换cacl

竹逸 发表于 2022-11-20 13:23:04

人造人 发表于 2022-11-20 12:19
//printf("sum =%.2f\n", cacl);      // 这个不是调用函数

帮我看下我上面的理解对不对{:10_250:}

人造人 发表于 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          callq1040 <printf@plt>

竹逸 发表于 2022-11-20 13:38:56

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

对,我表达有误,你这说法更准确{:10_254:}

竹逸 发表于 2022-11-20 13:49:04

本帖最后由 竹逸 于 2022-11-20 13:56 编辑

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

函数指针是不是就是该代码段的偏移地址?以汇编的角度我是这么理解的{:10_258:}

人造人 发表于 2022-11-20 14:00:25

竹逸 发表于 2022-11-20 13:49
函数指针是不是就是该代码段的偏移地址?以汇编的角度我是这么理解的

是的
页: [1]
查看完整版本: 函数指针下浮点数怎么设置?