2016-11-03 95 views
0

Added2:改變static後,它可以正確地GCC 4.8.4 慶典中工作(Ubuntu的4.8.4-2ubuntu1〜14 .04.3)在Windows上的Ubuntu的Ubuntu但是它不能在windows10中使用gcc 4.9.2(tdm-1)。我將編譯器更改爲具有gcc 4.9.2的cygwin,而不是tdm-1版本。奇怪,它的作品!所以我認爲編譯器也有一些錯誤!從類型 '無效*' 輸入 '詮釋*' 無效轉換

添加了1:我很抱歉,我發現我的編譯器是gcc不是g ++,我是新來的程序世界,請原諒我。我用.c來構建,但它有一些內存泄漏問題,我無法處理。所以我換到.cpp來建立,而這些錯誤出來了。所以這是我的情況。

windows 10 elipse gcc 4.8.4。我使用C語言。

elipse給我一個錯誤:從類型'void *'無效轉換爲類型'int *'[-fpermissive]

elipse建議這些線路有錯誤

FullList = malloc(N * sizeof(int)); 
l = malloc(N * sizeof(int)); 

我不知道如何糾正它。 任何領導將不勝感激!

這是涉及這句話的功能。

#define ALLCHK(x) if (x == NULL) {printf ("allocation error\n"); assert(x);} 
void Generate_Permutation(int N, int *p) 
/* generate permutation of length N in p */ 
/* p is zero based, but the permutation is not */ 
{ 
    int i,j;   /* to loop */ 
    int lspot;   /* offset in l */ 
    int *FullList;  /* unpermuted */ 
    int *l;   /* left to be used */ 

    FullList = malloc(N * sizeof(int)); 
    ALLCHK(FullList) 
    for (i=0; i<N; i++) *(FullList+i) = i+1; 
    l = malloc(N * sizeof(int)); 
    ALLCHK(l) 

    memcpy(l, FullList, sizeof(int)*N); 
    for (i=0; i < N; i++) { 
    lspot = (int)(URan(&seed) * (N - i)); 
    *(p+i) = *(l+lspot); 
    for (j=lspot; j<N-i; j++) *(l+j) = *(l+j+1); 
    } 
    free(l); free(FullList); 
} 
+0

錯誤不是來自Eclipse(這是一個編輯器),而是來自編譯器。順便說一句,你是用C還是用C++編寫的,它們是*不同的編程語言*;而C++ 11與C++ 98差別很大。 –

+4

C和C++的規則不同。你在使用哪一個? –

+2

作爲第一步,您需要決定使用哪種語言,C或C++。 –

回答

5

在C++中,一個void*不是隱式轉換爲一個int*。你需要明確強制轉換malloc的結果:

fullList = static_cast<int*>(malloc(N * sizeof(int))); 
l = static_cast<int*>(malloc(N * sizeof(int))); 

由於您使用C++,你將與new運營商更好:

fullList = new int[N]; 
l = new int[N]; 

// some code... 

delete[] fullList; 
delete[] l; 

雖然是在它,你可以採用獨特的指針:

std::unique_ptr<int[]> fullList = new int[N]; 
std::unique_ptr<int[]> l = new int[N]; 

// no delete at the end of the scope 

但更簡單,只需使用一個向量:

std::vector<int> fullList(N); 
std::vector<int> l(N); 
+0

爲什麼不使用'new'如果他們使用C++? – NathanOliver

1

對我來說,看起來您似乎將C代碼片段移植到C++(用於包含在C++項目中?)。

考慮這個答案是爲了解決您的問題,而不是最好的解決方案。

當C++使用malloc/free,你要投的void*指針由malloc爲返回到你想要的指針類型:

FullList = static_cast<int*>(malloc(N * sizeof(int))); 
l = static_cast<int*>(malloc(N * sizeof(int))); 

這樣做的理由(在簡單地複製了C代碼)是在C中,這些演員可以隱式執行

其他選擇是使用C編譯器編譯該文件,只需將該文件重命名爲.c而不是.cpp即可。然後,g ++(一個C++編譯器)會自動使用gcc(C編譯器)來編譯你的代碼。

再另一種選擇是重寫使用的new/delete代替malloc/free這個「真正的」 C++代碼,但你可以同樣也改寫它用現代的內存管理(比如std ::載體等。 )。

+0

你不應該在C++中使用'malloc'。你應該使用標準容器和智能指針。 –

+0

爲什麼不使用'new'? – NathanOliver

+0

我同意。但是這是C++項目中的一些C代碼片段。我將這種情況與使用C++中的C庫進行比較。在那裏,我不能簡單地說,嘿庫,使用新的而不是malloc,因爲你正在運行一個C++程序。我想,OP希望對移植的代碼應用最少的代碼更改。那麼在這裏用malloc說什麼? – leemes

0

在C中,您不必投射(void *)malloc的結果。在C++中,編譯器會哭泣,除非你施放。

+0

感謝您的善意幫助! –