我正在处理一个应该从文件加载2D数组的程序。
我的文件看起来像这样,第一个数字表示数组的大小:
10
7 6 9 4 5 4 3 2 1 0
6 5 5 5 6 5 4 3 2 1
6 5 6 6 7 6 8 4 3 2
1 5 6 7 7 7 6 5 4 3
5 5 6 7 6 7 7 6 5 9
5 6 7 6 5 6 6 5 4 3
5 6 7 9 5 5 6 5 4 3
5 5 6 7 6 6 7 6 5 4
5 9 5 6 7 6 5 0 3 2
5 5 5 5 6 5 4 3 2 7
到目前为止,这是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream prog;
prog.open("../prog1.dat");
//If file can't be opened, exit
if (!prog) {
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
}
else {
while (!prog.eof()) {
int size = 100, i, j;
prog >> size;
int **numArray = new int* [size];
for(i = 0; i < size; i++) {
numArray[i] = new int[size];
for(j = 0; j < size; j++) {
cout <<numArray[i][j] << " ";
}
cout << endl;
}
prog.close();
return 0;
}
}
}
但我得到的一个错误是说&#34;表达必须具有恒定的值&#34;在
int numArray[size][size];
我的部分代码。
我的问题是,我不知道如何使其保持不变,因为我从文件中获取大小,就像我不知道数组的大小一样。
这是我的第一个C ++程序,因为我的教授似乎认为,因为我们应该知道如何用Java做我们没有的东西,所以我自己一直教给自己。在课堂上讨论它。我发现处理使用常量的例子说它应该是这样的:
const int size = *value*;
但由于我的程序应该在文件中查找大小,我不知道该怎么做。有什么建议?另外,就像我说的那样,我对此非常陌生,所以如果您碰巧在我的代码中发现了需要修复的其他内容,那么我们也会非常感激。
答案 0 :(得分:4)
在C ++中定义数组时,必须在编译时知道大小。这就是编译器为该行产生错误的原因:
int numArray[size][size];
您可以使用std::vector
创建动态数组。
std::vector<std::vector<int>> numArray(size, std::vecot<int>(size));
现在,numArray
可以像静态定义的数组一样使用。
答案 1 :(得分:2)
这是不可能的。由于您在编译时不知道数组的大小,因此应该动态分配内存。
使用std::vector
:
std::vector<std::vector<int> > numbers;
答案 2 :(得分:1)
引用向量的答案是正确的,但是在C ++中创建动态数组的首选方法;你的代码可以工作。您遇到的问题是您正在尝试在堆栈上定义动态数组,但您无法做到这一点。您需要在堆上创建数组。
以下是如何做到这一点的一个很好的例子: How do I declare a 2d array in C++ using new?
答案 3 :(得分:1)
这应该有效。看,你只需使用for循环。
for(i = 0; i < size; i++) {
for(j = 0; j < size; j++) {
cout <<numArray[i][j] << " ";
}
cout << endl;
}
答案 4 :(得分:0)
常量可以表示不变的变量或文字,也就是任何值而不是变量,例如1,4,5。这些是整数文字。在这种情况下,编译器会说,对数组大小进行delcaraing的值需要一个文字。用整数替换'Size'。
更好的是,使用
#define SIZE 100
C / C ++中的宏只是在编译期间扩展的值。
或者如果要在运行时更改数组,可以使用指针。
int *array[10000]; // make the array large enough for most cases
// note the '*' that is a what makes a pointer
// read the size from file
for (int i = 0, i < size; ++i)
{
array[i] = new int [size]; // use 'new' to dynamically create an array
}
指针允许使用变量和文字创建数组。
这是使用指针的程序版本。研究它以了解它是如何工作的。
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream prog;
prog.open("prog1.dat");
//If file can't be opened, exit
if (!prog) {
cerr << "File could not be opened" << endl;
exit(EXIT_FAILURE);
}
int size = 100, i, j;
//prog >> size;
int **numArray = new int*; // pointers used here
for(i = 0; i < size; i++) {
numArray[i] = new int[size]; // pointer used here
for(j = 0; j < size; j++) {
prog >> numArray[i][j];
}
}
return 0;
cout << numArray[i][j];
}
答案 5 :(得分:0)
您也可以通过将numArray
声明为指向int指针的指针,然后在加载大小时分配numArray
及其内容来执行此操作。
使用后请注意正确释放内存,