C: вложенный массив l oop над 2d дает неожиданный результат - PullRequest
2 голосов
/ 24 апреля 2020

Это минимальный воспроизводимый пример проблемы. Иметь высоту и длину в качестве параметров (а не вычислять их) намеренно.

typedef struct
{
    int red;
} triple;

int main(void)
{
    triple array[3][3] = {
      { {.red = 10}, {.red = 40}, {.red = 70}},
      { {.red = 110}, {.red = 120}, {.red = 130}},
      { {.red = 200}, {.red = 220}, {.red = 240}}
    };

printarray(2, 2, array);
}


void printarray(int height, int length, triple array[][length])
{
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < length; j++)
        {
            printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
        }
    }
}

Вывод, который я получаю:
оценка красного в массиве [0] [0] = 10
оценка красного в массиве [0] [1] = 40
красная оценка в массиве [1] [0] = 70
красная оценка в массиве [1] [1] = 110

но Я бы ожидал:
красная оценка в массиве [0] [0] = 10
красная оценка в массиве [0] [1] = 40
красная оценка в массиве [1] [0] = 110
красная оценка в массиве [1] [1] = 120

Индексирование 2d-массива явно не работает, как я ожидаю, но почему?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2020

Вы передаете 2,2 на printarray. Это height,length.

Но массив определен с длиной 3. Таким образом, вы должны передать 3 в printarray в качестве длины.

В противном случае индексация в printarray неверна. Как вы понимаете, массив в printarray эквивалентен triple array[2][2] и , а не triple array[3][3], как требуется.

height может быть меньше определенной высоты, но length должны совпадать. Здесь length - это шаг . Это количество элементов в данной строке.

Итак, в main вызовите с: printarray(3,3,array)


Если вы истинно wi sh, чтобы напечатать подраздел массива, вы необходимо передать отдельную переменную в printarray для шага.

Функция должна быть объявлена ​​как:

void printarray(int height, int length, int stride, triple array[][stride])

Затем, в main, вызвать ее с помощью :

printarray(2,2,3,array);
2 голосов
/ 24 апреля 2020

Проблема в вашем вызове printarray:

printarray(2, 2, array);

, где вы сообщаете функции, что массив имеет две строки и два столбца - но это не так, он имеет три строки и три колонны. Компилятор предполагает, что вы не говорите ему неправду!

Вы должны вызвать вашу функцию с правильным значением параметра length, так как это используется компилятором для определения того, как чтобы вычислить смещения для элемента array[i][j].

Если вы хотите только затем напечатать part этого массива, вы должны указать количество столбцов и строк для печати в качестве дополнительных параметров для ваша функция, например:

void printarray(int height, int length, int nrows, int ncols, triple array[][length])
{
    if (nrows > height) nrows = height;
    if (ncols > width) ncols = width;   // Prevent error conditions!
    for (int i = 0; i < nrows; i++) {
        for (int j = 0; j < ncols; j++) {
            printf("red score at array[%i][%i] = %i\n", i, j, array[i][j].red);
        }
    }
}

, а затем вызовите функцию следующим образом:

    printarray(3, 3, 2, 2, array);

Примечание: вам также не хватает прототипа функции для printarray перед его использованием, что будет ошибкой на некоторых компиляторах (но только предупреждением на других); добавьте эту строку где-нибудь перед вашей main функцией:

void printarray(int height, int length, int nrows, int ncols, triple array[][length]);
...