2013-07-02 132 views
0

任何想法爲什麼會發生這種情況?錯誤:無法將類型「void *」的值分配給類型爲「float *」的實體

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

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

的錯誤是

​​

我應該做的強制轉換?假的事情是我在程序的其他地方做了同樣的事情,並且沒有顯示錯誤。

我有這樣的一個結構的一部分,我命名爲票面

long *tbegin; 

,然後我做

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

而且我沒有得到任何錯誤。

回答

1

這裏發生的事情很可能是您無意中將您的代碼編譯爲C++代碼。在C++中(與C相反)void *不能隱式轉換爲其他指針類型。

它你打算用C語言編寫代碼,確保將它編譯爲C.它打算用C++編寫代碼,你必須使用明確的類型轉換操作符來將void *指針轉換爲其他指針類型。

轉換爲long *指針類型可能發生在其他編譯爲C的翻譯單元(即其他文件)中。這可能是爲什麼它成功了。

請注意,編譯器可以爲每個翻譯單元獨立使用C和C++模式。許多編譯器會根據文件擴展名在C和C++之間進行選擇,將C文件編譯爲.c文件,將C編譯爲.cpp文件。

+0

奇怪的是,它適用於另一種情況。我一直在使用gcc進行編譯,但現在我使用nvcc,因爲我在Cuda中有一部分代碼。難道是nvcc使用gcc的情況下工作和nvcc它不工作? – Atirag

+0

@Atirag:「其他情況」在哪裏?相同的文件?其他文件?正如我上面所說的,語言的選擇是基於每個文件進行的,這就是爲什麼它可以輕鬆地在一個文件中編譯(編譯爲C)並且無法在另一個文件(編譯爲C++)中工作。什麼是您的文件的擴展名? '.c'? '.cpp'?還有別的嗎?你爲每個文件傳遞給編譯器的命令行開關是什麼? – AnT

+0

單獨的文件。另一種情況是在.c文件中,錯誤情況在.cu文件中,所以我想就是這樣。非常感謝。 – Atirag

相關問題