数组填充错误

时间:2011-01-18 22:25:55

标签: c++ arrays

我无法理解程序中的错误。我有这样的输入数据:

01000
11110
01000

我想将其保存到:vector< vector<int> > matrix;

vector< vector<int> > fillMatrix(vector< vector<int> > matrix, int height, int width, ifstream &read)
{
    // Make 2d-array [matrix]
    matrix.resize(width);
    for (int i=0; i < width; ++i)
        matrix[i].resize(height);

    // Fill it up with data
    for (int i=0; i < height; ++i)
    {
        std::string tempLine;
        std::getline(read, tempLine);
        for (int j=0; j < tempLine.length(); ++j)
        {
            // This shows right information
            //std::cout << tempLine[j] << "  -  " << (int)(tempLine[j] - '0') << "\n";
            matrix[i][j] = (int)(tempLine[j] - '0');
        }
    }

    return matrix;
}

matrix = fillMatrix(matrix, 3, 5, ifstreamHandle);

现在,显示矩阵的函数:

void showMatrix(vector< vector<int> > matrix, int width, int height)
{
    // Show the matrix
    for (int i=0; i < height; ++i)
    {
        for (int j=0; j < width; ++j)
        {
            std::cout << matrix[i][j];
        }
        std::cout << "\n";
    }
}

showMatrix(matrix, 5, 3);

showMatrix的结果是:

01000
11100
01000

第二排错过了'1'。怎么了?

2 个答案:

答案 0 :(得分:3)

首先,你的代码不一致

for (int i=0; i < width; ++i)
...
for (int i=0; i < height; ++i)

所以你要为matrix[i].resize(3)创建i = 0..4之类的矩阵,但是使用matrix[i][j] i = 0..2j=0..4

写入{{1}}

答案 1 :(得分:3)

初始化矢量时,宽度和高度错误。当您稍后从最后两列读取时,结果将是未定义的。

matrix.resize(width);
for (int i=0; i < width; ++i)
    matrix[i].resize(height);

应该是

matrix.resize(height);
for (int i=0; i < height; ++i)
    matrix[i].resize(width);

您的fillMatrix函数的widthheight的顺序与您稍后在showMatrix中调用的顺序不同。我建议在fillMatrix中交换订单,使其与showMatrix中的订单保持一致。

小心地将每一行填充到tempLine.length,这可能会大于width,这将导致异常。你也可以从showMatrix中的向量中获取宽度和高度,而不是将它们作为参数。正如@Charles所说,你应该通过引用传递向量以避免复制。 fillMatrix中的vector参数目前是无用的,因为你必须返回它,除非你把它变成一个引用并使函数void