在C ++中使用常量

时间:2014-09-11 05:49:39

标签: c++ arrays

我正在处理一个应该从文件加载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*;

但由于我的程序应该在文件中查找大小,我不知道该怎么做。有什么建议?另外,就像我说的那样,我对此非常陌生,所以如果您碰巧在我的代码中发现了需要修复的其他内容,那么我们也会非常感激。

6 个答案:

答案 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及其内容来执行此操作。

使用后请注意正确释放内存,