матрица печати любого размера - PullRequest
0 голосов
/ 27 марта 2011

У меня есть этот метод для печати:

void printMatrix(int matrix[][3]){
  int i = 0, j = 0;
  int leni, lenj;

  leni = sizeof matrix / sizeof matrix[0][0];
  lenj = sizeof (matrix[0]) / sizeof (matrix[0][0]);

for(i = 0 ; i < leni ; i++)
{
    for(j = 0 ; j < lenj ; j++)
    {
        printf("%d  ", matrix[i][j]);
    }
    printf("\n");
}
printf("\n");

}

и матрица:

int A[2][3] = {{1, 3, 4},
               {2, 0, 1},

, и этот метод пишет мне мою матрицу только для 2 x3, я проводил исследование, и leni и lenj возвращают довольно плохие числа, проблема будет в void vypisMatice(int matrix[][3]){, где я объявляю матрицу с количеством столбцов, но без этого числа компилятор не скомпилирует мое приложение.Я просто хочу узнать, как настроить мой метод для приема матрицы любого размера при печати, например printMatrix (A);?

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 марта 2011

Обратите внимание, что в объявлении функции любой параметр типа массива преобразуется в параметр соответствующего типа указателя.

void printMatrix(int matrix[][3]);

объявляет ту же функцию, что и

void printMatrix(int (*matrix)[3]);

Параметр matrix является указателем на массив из трех int. Когда вы передаете A в функцию, то фактически передается указатель на первый элемент массива, то есть a int (*)[3].

Это вычисление sizeof matrix / sizeof matrix[0][0] дает размер указателя, деленный на размер int, который не имеет ничего общего с количеством членов исходного массива. Это число не может быть определено из параметров, которые вы передаете. Вам нужно явно передать измерения вашего внешнего массива в функцию.

Когда вы объявляете массив (даже в объявлении функции, где он будет преобразован в тип указателя), тип элемента массива должен быть полным типом. Если вы не предоставите тип целочисленной константы для типа массива, этот массив имеет неполный тип. В вашем случае, поскольку int[] является полным типом, тип int[][] недопустим, вы должны указать все, но не более верхнего измерения, в многоуровневом массиве типа массивов.

Если вы используете функции C99 (обратите внимание, что они не совместимы с C ++), то вы можете использовать массив переменной длины (VLA), но в определении функции длина внутреннего массива параметра массива должна все равно передается в качестве дополнительного параметра.

1025 * Е.Г. *

void printMatrix(int leni, int lenj, int[][lenj])
{
    // ...
}
1 голос
/ 27 марта 2011

leni = sizeof matrix / sizeof matrix[0][0]; не рассчитывает количество строк.Фактически он ничего не вычисляет.

Лучший способ - предоставить leni и lenj для явного функционирования в качестве дополнительных параметров, таких как void printMatrix(int *matrix, int leni, int lenj).

Также вы должны знать, что способа определитьразмер некоторого случайного массива, потому что это просто указатель без метаинформации.

0 голосов
/ 27 марта 2011

Если вам нужно принять матрицу произвольного размера, вам нужно будет включить в printMatrix() параметры, которые сообщают ему, каков размер вашего массива. Что-то вроде:

void printMatrix(int *matrix, int rows, int columns)

Затем вы можете использовать параметры rows и columns для управления вашими циклами в процедуре печати вместо того, чтобы вычислять их самостоятельно.

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