:警告:ISO C++;禁止可变长度数组‘;s1和x2019;[-Wvla] 我正在构建一个包含C++程序的R包。支票正常,但我收到了这个信息 警告:ISO C++禁止可变长度数组's1'(Wvla)
CRAN的维护人员说错误在代码的这一部分,如下所示。我认为“nrows”这个论点是多余的,但我想知道是否有其他方法来解决这个问题:警告: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
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拥有的动态数组。这应该是一个答案。非常感谢。你的建议是正确且简单的。埃德加