c++ - 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;
}
任何答案将不胜感激!
解决方案
如果你真的不能使用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) {
推荐阅读
- jestjs - 如何在 Jest 测试之间共享快照?
- wordpress - WordPress - 如何在不删除小部件的情况下禁用侧边栏?
- mysql - SQL,从 min 中找到 max 大于 20% 和更新的任何符号的 min 和 max
- scala - Scala:表达式与方法/函数比较
- python - 在 Dash 中将动态文本返回到 html.P
- java - XStream 反序列化简单 XML 在应该创建集合时不断给出错误说没有这样的字段
- ruby - 并发迁移问题 rails 5
- php - 如何使用 Laravel 8 创建每年都会重置的递增自定义 ID?
- java - 将集合类型转换为 HashSet 和使用集合初始化 HashSet 有什么区别?
- c# - 资源原始文件夹在 xamarin.forms 中本地化