首页 > 解决方案 > ISO C++ 禁止变长数组 'arrayz' [-Wvla],已经在 c++ 在线 gdb 编译器上尝试过,它运行良好

问题描述

我想知道为什么下面的程序会产生这个错误。我已经尝试过在线 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;
}

任何答案将不胜感激!

标签: c++arraysvariable-length-array

解决方案


如果你真的不能使用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) {

推荐阅读