Массив теряет данные после цикла for - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующий код:

cin >> r >> c;
char map[c][r];
for(int i = 0; i < r; i++)
{
    string line;
    cin >> line;
    for (int j = 0; j < c; ++j) {
        map[j][i] = line[j];
    }
}


int n;
cin >> n;
//cout << "first " << endl << map[0][0] << endl<< map[1][0] << endl<< map[2][0] << endl<< map[3][0] << endl;

pair<pair<int, int>, pair<int,int>> queries[n];
for (int k = 0; k < n; ++k) {
    int r1, c1, r2, c2;
    cin >> r1 >> c1 >> r2 >> c2;
    queries[n] = make_pair(make_pair(r1-1, c1-1), make_pair(r2-1, c2-1));
}
cout << "test" << endl;

У меня действительно странная проблема, когда мой массив карт, похоже, теряет все свои данные после второго цикла for.У меня есть точки останова на строках "int n;"и "cout <<" test << endl; "</p>

В первой точке останова мой массив char заполнен ожидаемыми значениями, но, тем не менее, во второй точке останова все значения в массиве char равны '\ 000 '.

Что может быть причиной этого?

1 Ответ

3 голосов
/ 20 марта 2019

Проблема первая:

cin >> r >> c;
char map[c][r];

И позже:

pair<pair<int, int>, pair<int,int>> queries[n];

Это массивы переменной длины (VLA), которые являются функцией C, а не C ++.VLA не являются частью языка C ++, хотя многие компиляторы поддерживают это расширение.Вместо этого вы можете использовать std::vector<std::vector<char>> для эмуляции поведения.

Проблема вторая:

for(int i = 0; i < r; i++)
{
    string line;
    cin >> line;
    for (int j = 0; j < c; ++j) {
        map[j][i] = line[j];
    }
}

Это неопределенное поведение, поскольку длина строки чтения может быть меньше, чем c, нокод обращается к c элементам независимо от line.length().Это должно быть:

for(int i = 0; i < r; i++)
{
    string line;
    cin >> line;
    for (int j = 0; j < c; ++j) {
        map[j][i] = j < line.length() ? line[j] : '\0';
    }
}

Проблема 3:

Еще одно неопределенное поведение

pair<pair<int, int>, pair<int,int>> queries[n];  // better use std::vector
for (int k = 0; k < n; ++k) {
   ...
   // Out of bounds queries[n]
   queries[n] = make_pair(make_pair(r1-1, c1-1), make_pair(r2-1, c2-1));

Последнее, вероятно, уничтожает ваш массив map.Скорее всего, доступ за пределами области находится в той же области памяти, что и некоторые элементы map.

...