:警告:ISO C++;禁止可变长度数组‘;s1和x2019;[-Wvla] 我正在构建一个包含C++程序的R包。支票正常,但我收到了这个信息 警告:ISO C++禁止可变长度数组's1'(Wvla)

:警告:ISO C++;禁止可变长度数组‘;s1和x2019;[-Wvla] 我正在构建一个包含C++程序的R包。支票正常,但我收到了这个信息 警告:ISO C++禁止可变长度数组's1'(Wvla),c++,C++,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

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;
    }
double entCI(双输入[],int-cMatrix[],双分区,
整数nrows、整数begin、整数end)
{
双s1[nrows],s2[nrows],熵;
int cs1[nrows],cs2[nrows];
int s1Count=0,s2Count=0,scont=0;

while(input[begin]通常,您应该使用动态内存分配来创建变量数组: double*s1=新的double[nrows]; 然后,记住删除该数组


另一种解决方案是使用std::vector而不是普通数组。

事实上,错误在以下几行:

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

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

我认为“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;
    }

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

可变长度数组,这在很长一段时间内是gcc的一项功能。C99中已经接受了它,但在C++11中却没有(也不在任何C++版本中)。

一个简单而干净的解决方案是编译该函数作为C,因为它不使用任何特定的C++特性,简单的数组操作。实际上,这个函数是纯C,恰好被G++接受,但不正确C++,因此警告。 我的建议是:

  • 将函数放入
    .c
    文件中,并在C99模式下编译
  • 将其声明为
    extern“C”double entCI(双输入[],int-cMatrix[],双分区,
    在其他C++模块中,int nRead、int开始、int结尾)<或代码>,或者最好写包含文件作为< /p>
    
    #ifdef C++
    extern "C" {
    #endif
    double entCI(double input[], int cMatrix[], double partition, 
        int nrows, int  begin, int end)
    #ifdef C++
    }
    #endif
    

你的目标是什么?让它工作起来还是让它成为可移植的正确C++?它的简单选择是禁用或忽略警告。代码使用C++中不有效的C99特征,但是C++编译器支持该特性。为了使它成为有效的便携代码,你应该将本地数组更改为UnjyJPTR拥有的动态数组。这应该是一个答案。非常感谢。你的建议是正确且简单的。埃德加