Неправильные результаты при печати подматрицы двумерного массива в C - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в C и изучаю массивы. Я сделал функцию print2d, чтобы распечатать двумерный массив. Я создал массив 9x9, array2d. Сначала я распечатал array2d, используя print2d, который работал отлично. Затем я попытался распечатать подматрицу 3x3 array2d, которая состоит из элементов в первых трех строках и первых трех столбцах. Подматрица 3x3 распечатана неправильно.

В основном:

int array2d[9][9] = {
        {0, 1, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {1, 1, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0}
    };
    print2d(rows,cols,array2d);

    print2d(3,3,array2d); // print 3x3 submatrix
void print2d(int rows, int cols, int array[][cols])
{
    printf("{");

    for (int r = 0; r < rows; r++)
    {
        printf("{%i",array[r][0]);
        for (int c = 1; c < cols; c++)
        {
            printf(", %i",array[r][c]);
        }
        printf("}\n");
    }
    printf("}\n");
}

Вывод: Матрица 9x9 array2d распечатывается правильно, а подматрица 3x3 выводится как:

{{0, 1, 0}
{0, 0, 0}
{0, 0, 0}
}

вместо

{{0, 1, 0}
{0, 0, 0}
{1, 1, 0}
}

Первый ряд подматрицы правильный, а третий - нет. Я предполагаю, что при вызове print2d(3,3,array2d) функция print2d ожидает двухмерный массив с 3 столбцами (int array[][3]), а не массив 9x9. Я не уверен, что это за проблема, и почему первая строка вывода верна, но не третья. Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете использовать двойной указатель вместо 2D-массива

void print2d(int rows, int cols, int **array);

Или определить подмассив как комментарий @Weather_Vane выше:

void print2d(int rows, int cols, int array[rows][cols], int sub_row, int sub_col) {
   for (int r = 0; r < sub_row; r++)
    {
       ...
        for (int c = 1; c < sub_col; c++)
        {
          ...
        }
        ...
    }
    printf("}\n");
}

основная функция для массива с аргументами подмассива

print2d(9,9,array2d, 9, 9);
print2d(9,9,array2d, 3, 3);

основная функция для двойного указателя:

int main() {
  int rows, cols, i;
  int **array2d;

  /* obtain values for rows & cols*/

  // allocate the array
  array2d = malloc(rows * sizeof(int));
  if (!array2d)
    return -1;
  for (i=0; i<rows; i++) {
    array2d[i] = malloc(cols * sizeof *array2d[i]);
    if(!array2d[i])
        return -1;
  }

  /*init the values of array here */

  print2d(rows,cols,array2d);
  for (i=0; i<rows; i++)
    free(array2d[rows];
  free(array2d);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...