:警告:ISO C ++禁止变长数组's1'[ - Wvla]

时间:2015-11-19 12:13:44

标签: c++

我正在构建一个包含c ++程序的R包。检查运行正常,但我收到此消息 :警告:ISO C ++禁止变长数组's1'[ - Wlala]

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;
    }

3 个答案:

答案 0 :(得分:3)

确实,错误出现在这些方面:

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

它们声明数组,其大小取决于nrows参数。 nrows的值在运行时确定,因此数组必须是可变长度。 c ++标准不允许这样的数组变量按警告告诉你。

  

我在想这个论点&#34; nrows&#34;是多余的

我不知道那是怎么回事。它已在函数中使用。

  

但我想知道是否有另一种解决问题的方法

有办法解决问题。如果需要在运行时确定数组的大小,则必须动态分配它。最简单和最安全的方法是使用std::vector

答案 1 :(得分:0)

通常,您应该使用动态内存分配来创建变量数组: double * s1 = new double [nrows]; 然后,记得删除该数组。

其他解决方案是使用std :: vector而不是plain array。

答案 2 :(得分: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