Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么返回float的函数不能与void*回调一起工作?_C_Callback - Fatal编程技术网

C 为什么返回float的函数不能与void*回调一起工作?

C 为什么返回float的函数不能与void*回调一起工作?,c,callback,C,Callback,在下面的代码中,为什么int可以工作而不是float?结果如下 voidptr.c: #include <stdio.h> typedef void* (*Fn) (); int Fun() { return 5; } float fFun() { return 5.0; } void callfun(Fn f) { printf ("%d \n", f()); } void callffun(Fn f) { printf ("%f \n"

在下面的代码中,为什么int可以工作而不是float?结果如下

voidptr.c:

#include <stdio.h>

typedef void* (*Fn) ();

int Fun()
{
    return 5;
}

float fFun()
{
    return 5.0;
}


void callfun(Fn f)
{
    printf ("%d \n", f());
}

void callffun(Fn f)
{
    printf ("%f \n", f());
}



int main()
{

    callfun(Fun); // works
    callffun(fFun); // --> doesnt work ??
    printf ("%f", fFun()); // works

    return 0;
}

你在对编译器撒谎。结果是不可预测的。

你在对编译器撒谎。结果是不可预测的。

你不能将一个void*投射到一个float上,然后期望它工作

更好的解决方案是让回调函数返回void,但接受void*作为删除返回值的位置:

typedef void (*Fn) (void *);

void Fun(void *ptr)
{
    *(int *)ptr = 5;
}

void fFun(void *ptr)
{
    *(float *)ptr = 5.0;
}

void callfun(Fn f)
{
    int num;
    f(&num);
    printf ("%d \n", num);
}

void callffun(Fn f)
{
    float num;
    f(&num);
    printf ("%f \n", num);
}
这仍然存在问题-您需要提前知道传递给回调的指针指向的是哪种类型的变量。

您不能将void*强制转换为float并期望它工作

更好的解决方案是让回调函数返回void,但接受void*作为删除返回值的位置:

typedef void (*Fn) (void *);

void Fun(void *ptr)
{
    *(int *)ptr = 5;
}

void fFun(void *ptr)
{
    *(float *)ptr = 5.0;
}

void callfun(Fn f)
{
    int num;
    f(&num);
    printf ("%d \n", num);
}

void callffun(Fn f)
{
    float num;
    f(&num);
    printf ("%f \n", num);
}


这仍然存在问题-您需要提前知道传递给回调的指针指向的是哪种类型的变量。

它实际上不起作用。你只是朝着脚的方向开枪,碰巧击中了一个因昨晚酗酒而已经麻木的脚趾。什么不起作用?什么不起作用?编译时错误,运行时错误?请说得具体点,它不起作用。如果您打开了应该执行的编译器警告,您将看到它没有干净地编译:。您应该注意编译器消息。结果在底部,它返回0.000而不是5.000。它实际上不起作用。你只是朝着脚的方向开枪,碰巧击中了一个因昨晚酗酒而已经麻木的脚趾。什么不起作用?什么不起作用?编译时错误,运行时错误?请说得具体点,它不起作用。如果您打开了应该执行的编译器警告,您将看到它没有干净地编译:。你应该注意编译器消息。结果在底部,它返回0.000而不是5.000。你是什么意思?我怎样才能使回调成为泛型,这样我就可以返回int和float?@purpletech:你不能,因为你对结果没有任何用处。充其量,您可能会考虑返回某种变体对象,一个包含一个联合的结构,一个枚举/标志应该足够了。@ PrPuleTeC:主叫方如何知道它是否返回了int或浮点?也许你想要一个结构,它包含一个int,一个float,和一些返回的指示符?好吧,我的引擎只需要调用回调,返回值会返回给知道它是什么类型的用户,他用我的结果编写一个函数。返回void*是不可能的还是什么?返回void*是可能的,但只能转换到其他类型的指针。您需要规则来确定它指向的对象的生存期。谁分配?谁放的?你什么意思?我怎样才能使回调成为泛型,这样我就可以返回int和float?@purpletech:你不能,因为你对结果没有任何用处。充其量,您可能会考虑返回某种变体对象,一个包含一个联合的结构,一个枚举/标志应该足够了。@ PrPuleTeC:主叫方如何知道它是否返回了int或浮点?也许你想要一个结构,它包含一个int,一个float,和一些返回的指示符?好吧,我的引擎只需要调用回调,返回值会返回给知道它是什么类型的用户,他用我的结果编写一个函数。返回void*是不可能的还是什么?返回void*是可能的,但只能转换到其他类型的指针。您需要规则来确定它指向的对象的生存期。谁分配?谁释放了它?下面两个可以工作,尽管返回堆栈ptr不是一个好主意。我仍然想知道为什么int在我的第一个示例中起作用?float*fFun{float f;f=float malloc sizeoffloat;f=5.0;return f;}float fFun{float f=5.0;return&f;}@purpletech:代码被破坏了。你扔掉malloc的返回值,然后当你说你将返回一个float*时,你返回一个float。你可能想要的是类似float*f的东西;f=mallocsizeoffloat*f=5.0;返回f+1泰铢。如果您仔细注意,我提供了与您提供的相同的malloc解决方案,但是我想知道是否可以像float*fFun{float f=5.0;return&f;}那样在堆栈中返回一个ptr。它是有效的,但它是不安全的,对吗?另外,我的研究是找到一种通用的返回类型。void*是最好的类型吗?不要紧,我在这里找到了答案:下面两个可以工作,尽管返回堆栈ptr不是一个好主意。我仍然想知道为什么int在我的第一个示例中起作用?float*fFun{float f;f=float malloc sizeoffloat;f=5.0;return f;}float fFun{float f=5.0;return&f;}@purpletech:代码被破坏了。你扔掉malloc的返回值,然后当你说你将返回一个float*时,你返回一个float。你可能想要的是类似float*f的东西;f=mallocsizeoffloat*f=5.0;返回f;
.+1泰铢。如果您仔细注意,我提供了与您提供的相同的malloc解决方案,但是我想知道是否可以像float*fFun{float f=5.0;return&f;}那样在堆栈中返回一个ptr。它是有效的,但它是不安全的,对吗?另外,我的研究是找到一种通用的返回类型。void*是最好的类型吗?没关系,我在这里找到了答案: