ISO C ++禁止使用可变长度数组'arrayz'[-Wvla],已经在c ++在线gdb编译器上进行了尝试,并且运行良好

时间:2019-03-05 15:01:02

标签: c++

我想知道为什么以下程序会产生此错误。我已经尝试了在线gdb编译器,并且工作正常。我已经在线搜索了它,有人建议使用向量而不是数组,但是我不能,因为我需要在这里使用数组。有人可以为我的程序提供一些建议以使其正常运行吗?

我必须通过VPL提交此程序,该程序在Linux上运行,并且带有-pedantic错误标志。

程序将从用户输入中输出方差(var)。

#include <iostream>
using namespace std;

double jum(double arrayz[], int y) {
   double total=0, jumlah;
   for (int i=0; i<y; ++i) {
       total+=arrayz[i];
   }
   jumlah = total/y;
   return jumlah;
}
double rata2(double arrayz[], int y) {
   double total=0,average;
   for (int i=0; i<y; ++i) {
       total+=arrayz[i];
   }
   average = total/y;
   return average;
}
int main() {
    double data,average,jumlah;
    int y;
    cin >> y;
    double arrayz[y]={};
    for (int i=0; i<y; ++i) {
        cin >> data;
        arrayz[i]=data;
    }
    average=rata2(arrayz, y);
    for (int i=0; i<y; ++i) {
        arrayz[i]=(arrayz[i]-average)*(arrayz[i]-average);
    }
    jumlah=jum(arrayz, y);
    cout << "Variance : " << jumlah;
    return 0;
}

任何答案将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果您真的不能使用std::vector,那么只需执行以下操作:

double *arrayz = new double[y];

然后,在程序结束时,再次释放内存:

delete[] arrayz;
  

我想知道为什么以下程序会产生此错误。我有   在在线gdb编译器上进行了尝试,效果很好。

是的,VLA实际上不是C ++的一部分,但是某些编译器仍然允许它作为编译器扩展。正如您从-pedantic中学到的,通常,可以将允许这样做的对象配置为发出警告。

但是,您真的不能使用std::vector吗?似乎很需要编写C ++程序,但不允许使用这种基本容器。在那种情况下,程序也可能在允许VLA的C语言中。您将制作一个像这样的向量:

std::vector<int> arrayz(y);

并更改函数签名以引用这样的引用:

double jum(std::vector<int> &arrayz, int y) {
double rata2(std::vector<int> &arrayz, int y) {