Ругается компилятор

88
13 февраля 2022, 14:30

Ошибка компиляции на cols во вложенном цикле:

void FillArr(int arr[], const int ROW, const int COL) {
    for (int cols = 0, num = 0; cols < COL; cols++) {
        for (int rows = 0; rows < ROW; rows++, num++) {
            arr[rows][cols] = num;
        }
    }
}
Answer 1

(ответа нет, комментарии есть, так что попробую написать ответ) Вы пытаетесь обратиться к одномерному массиву как к двумерному:

// здесь int arr[] тоже самое, что и int *arr
void FillArr(int arr[], const int ROW, const int COL) {
    ...
    arr[rows][cols] = ...;
    ...
}

Из-за чего компилятор не понимает ваших намерений и выдает ошибку компиляции.

Исправить проблему можно двумя способами, в зависимости от того, что у вас представляет из себя двумерный массив.

  1. Изменить сигнатуру метода, то есть сделать в функции из arr двумерный массив. Использовать, если входной массив был создан как int *arr[y] (y -> количество строк) или int **arr.
//           int *arr[],
void FillArr(int **arr, const int ROW, const int COL) {
    for (int cols = 0, num = 0; cols < COL; cols++) {
        for (int rows = 0; rows < ROW; rows++, num++) {
            arr[rows][cols] = num;
        }
    }
}
  1. Использовать математику, чтобы превратить обращение к одномерному массиву так, будто бы это двумерный массив. Использовать, если входной массив был создан как int arr[x], int *arr; еще можно ожидать int arr[y][x], однако придется будет преобразовывать его в int* -> reinterpret_cast<int*>(arr) при вызове.
//           int arr[],
void FillArr(int *arr, const int ROW, const int COL) {
    for (int cols = 0, num = 0; cols < COL; cols++) {
        for (int rows = 0; rows < ROW; rows++, num++) {
            // rows * COL позволит нам перепрыгнуть определённое количество
            // элементов (равняещееся количеству колонок в двумерном
            // массиве умноженное на количество пройденный строчек),
            // а суммирование просто сделает отступ от этого прыжка.
            // Прыжком мы дойдем до нужной строки, а отступ
            // позволит получить элемент в этой строке.
            arr[rows * COL + cols] = num;
        }
    }
}

Проверял свои суждения на gcc 8.3.0; gcc -xc++ -lstdc++ -shared-libgcc -std=C++14.

READ ALSO
Выводится лишний текст в окне winapi

Выводится лишний текст в окне winapi

Подскажите, Как исправить ввод лишних символов?

77
UrlDownloadToFile ошибка E_ABORT Operation aborted

UrlDownloadToFile ошибка E_ABORT Operation aborted

Код C++, Visual Studio 2019, urlmon подключен, вызываю так:

85
Почему bitset обнуляется

Почему bitset обнуляется

Я хочу по битам считать определенную область памяти, первый вариант работает, второй - нет, хотя делает почти то же самое

127
Необходимо определить, может ли пара ферзей напасть на друг друга, если известны координаты 8 ферзей

Необходимо определить, может ли пара ферзей напасть на друг друга, если известны координаты 8 ферзей

Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг другаВам дана расстановка 8 ферзей на доске, определите, есть...

129