Closed. This question is off-topic. It is not currently accepting answers. Learn more
想改进这个问题吗?Update the question所以堆栈溢出的值小于aa>。
去年关门了。
我正在尝试重新编程printf函数(大学项目),但是%f给我带来了问题。
我使用如下函数指针:
void (*fct[15])(void*) =
            {printfs, printfc, printfd, printfd, printfl, printfx, printfX,
             printfo, printfb, printfS, printfu, printfp, printff};

使用右标志时,将调用其中一个函数。
典型的printfd将接收一个void*变量作为参数,并执行以下操作:
int nbr = (int)var;     //var is a void* type variable
my_put_nbr(var);        //handmade function wich displays numbers

奇怪的是,当我为printff做同样的事情时,它没有工作
float nbr = (float)var;

我收到消息了
错误:在需要浮点值的位置使用指针值
浮动nbr=(浮动)变量
我也尝试过这样的事情。如果我有
my_printf("%f", var);     //with var = 12.34

然后我调用printff()函数,它应该:
int nbr1 = (int)(var / 1);
int nbr2 = (int)(var % 1);

所以我通常会有nbr1=12和nbr2=34,然后我会在两者之间显示一个“.”,但仍然不起作用,我得到消息:
错误:二进制*的操作数无效(具有“void*”和“int”)int nbr1
=(整数)(变量*1)
我想不通,如果你有什么线索,告诉我。
另外,我不能使用printf()之类的命令,这是这个练习的规则,所以不要告诉我解决方案隐藏在这里。

最佳答案

如果我正确地理解了您的问题,当您完全确定调用方部分时,在被调用函数中,考虑到您在var中接收到参数,您可以
对于int

printf("%d", *(int *)var);

对于float/double
printf("%f", *(double *)var);

等等。
请注意,对于变量函数,不存在float类型,因为对于这些函数,由于默认参数的提升,float类型被提升到double
要详细说明,不要将传入指针强制转换/分配给所需的类型(这是无效的[类型不匹配]和不需要的类型)。相反,您将void *参数强制转换为适当的调用方参数类型(基于您提到的标志),然后取消引用以获取值。
这个类比是基于第6.3.2.3章中提到的属性
指向C11的指针可以转换为或从指向任何对象类型的指针转换。指向
任何对象类型都可以转换为指向void的指针,然后再转换回来;结果应
与原始指针相等。

关于c - 从空值获得浮点数* ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47903238/

10-16 20:22