【问题标题】:error: a value of type "void *" cannot be assigned to an entity of type "float *"错误:“void *”类型的值不能分配给“float *”类型的实体
【发布时间】:2013-07-02 09:33:39
【问题描述】:

知道为什么会发生这种情况吗?

float *image;
long size_img=par->N*par->M;

image = calloc(size_img, sizeof(float));//the compiler shows error here

错误是

error: a value of type "void *" cannot be assigned to an entity of type "float *"

我应该做演员吗?虚假的事情是我在程序的其他地方做了同样的事情并且没有显示错误。

我把它作为我命名为 par 的结构的一部分

long *tbegin;

然后我做

par->tbegin = calloc( SUMA_J, sizeof ( long ) );

我没有收到任何错误。

【问题讨论】:

    标签: c casting calloc


    【解决方案1】:

    这里发生的情况很可能是您无意中将代码编译为 C++ 代码。在 C++(相对于 C)中,void * 不能隐式转换为其他指针类型。

    如果您打算用 C 编写代码,请确保将其编译为 C。如果您打算用 C++ 编写代码,则必须使用显式类型转换运算符将 void * 指针转换为其他指针类型.

    long *指针类型的转换可能发生在编译为C的其他翻译单元(即其他文件)中。这可能是它成功的原因。

    请注意,编译器可以为每个翻译单元独立使用 C 和 C++ 模式。许多编译器会根据文件扩展名在 C 和 C++ 之间进行选择,将.c 文件编译为 C,.cpp 文件编译为 C++。

    【讨论】:

    • 奇怪的是它适用于另一种情况。我一直在使用 gcc 进行编译,但现在我使用的是 nvcc,因为我有一些使用 Cuda 的代码。会不会是 nvcc 在有效的情况下使用 gcc 而在无效的情况下使用 nvcc?
    • @Atirag:那个“其他案例”在哪里?同一个文件?其他文件?正如我上面所说的,语言的选择是基于每个文件的,这就是为什么它可以很容易地在一个文件中工作(编译为 C)而不能在另一个文件中工作(编译为 C++)。你的文件扩展名是什么? .c? .cpp?还有什么?您为每个文件传递给编译器的命令行开关是什么?
    • 单独的文件。另一种情况在 .c 文件上,而错误情况在 .cu 文件上,所以我想就是这样。非常感谢。
    • 嗯,显然您使用的编译器将 .cu 扩展视为 C++ 扩展。不过,没有必要更改扩展名(如果您不想这样做)。您通常可以通过指定命令行开关来强制编译器使用特定语言。
    猜你喜欢
    • 2018-02-17
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2019-03-27
    相关资源
    最近更新 更多