2015-11-19 28 views
2

我正在構建一個包含C++程序的R包。檢查運行正常,但我收到此消息 :警告:ISO C++禁止可變長度數組's1'[-Wvla]:警告:ISO C++禁止可變長度數組's1'[-Wvla]

CRAN的維護者說錯誤在這部分代碼如下所示。我在想,爭論「NROWS」是多餘的,但我不知道是否有另一種方式來解決這個問題

double entCI(double input[], int cMatrix[], double partition, 
    int nrows, int begin, int end) 
    { 
    double s1[nrows], s2[nrows], entropy; 
    int cs1[nrows], cs2[nrows]; 
    int s1Count=0, s2Count=0, sCount=0; 
    while(input[begin]<partition) 
    { 
    cs1[s1Count]=cMatrix[begin]; 
    s1[s1Count++]=input[begin++]; 
    } 
    while(begin<end) 
    { 
    cs2[s2Count]=cMatrix[begin]; 
    s2[s2Count++]=input[begin++]; 
    } 
    sCount=s1Count+s2Count; 
    entropy=(s1Count/double(sCount))*ent(s1,cs1,s1Count) 
      +(s2Count/double(sCount))*ent(s2,cs2,s2Count); 
    return entropy; 
    } 
+1

您的目標是?讓它起作用?或者讓它可移植正確的C++?使其工作的簡單選擇是禁用或忽略警告。該代碼使用C++中無效的C99功能,但您的C++編譯器支持該功能。爲了使其有效的可移植代碼,您應該將本地數組更改爲unique_ptr擁有的動態數組。 – JSF

+0

@JSF這應該是一個答案。 – emlai

回答

0

一般來說,你應該使用動態內存分配,以創建數組出變量: 雙* S1 =新雙[nrows]; 然後,請記住刪除該數組。

其他解決方案是使用std :: vector而不是普通數組。

+0

非常感謝。你的建議是正確的,也是最簡單的。埃德加 –

3

事實上,錯誤的是在這些線路上:

double s1[nrows], s2[nrows], entropy; 
int cs1[nrows], cs2[nrows]; 

他們聲明數組,其大小取決於nrows說法。 nrows的值在運行時確定,因此數組必須是可變長度。這些數組變量不被C++標準所允許,正如告訴你的那樣。

我想到的說法「NROWS」是多餘的

我不明白那是怎麼回事。它在函數中使用。

,但我不知道是否有另一種方式來解決這個問題

有辦法解決這個問題。如果數組的大小需要在運行時確定,它必須動態分配。最簡單和最安全的方法是使用std::vector

0

可變長度數組很長時間是gcc的一個特性。它在C99中已被接受,但在C++ 11中沒有(在我知道的任何後續C++版本中)。

一個簡單而乾淨的解決方案是將該函數編譯爲C,因爲它不使用任何特定的C++特性,僅僅是數組操作。事實上,這個函數是普通的C語言,它恰好被g ++所接受,但不正確的C++,因此是警告。

我的建議是:

  • 把功能在.c文件並編譯它在C99模式
  • 在其他C++模塊,或者更好寫聲明爲extern "C" double entCI(double input[], int cMatrix[], double partition, int nrows, int begin, int end)包含文件聲明爲

    #ifdef C++ 
    extern "C" { 
    #endif 
    double entCI(double input[], int cMatrix[], double partition, 
        int nrows, int begin, int end) 
    #ifdef C++ 
    } 
    #endif