我正在构建一个包含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;
}
答案 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