Негабаритные матрицы в C: как передать их в качестве аргумента функции, манипулировать и вернуть их в моем коде? - PullRequest
0 голосов
/ 23 октября 2019

Я хотел бы знать, как передать матрицу переменных строк и столбцов в функцию, преобразовать ее внутри функции и вернуть ее в C.

Здесь находится код, который я пытаюсь построитьсделать это.

#include <stdio.h>
#include <stdlib.h>


void **f(int **m, int w, int h);

int main()
{
  int A[3][3]={{1,2,3},{4,5, 6},{7,8,9}};
  int B[3][2]={{1,2},{3, 4}, {5, 6}};

  f(A, 3, 3);
  f(B, 3, 2);

  return 0;
}

void **f(int **m, int w, int h )
{
    int i,j;
    int n[w][h];

    for(i=0;i<w;i++)
    {
      for(j=0;j<h;j++)
        n[i][j] = m[i][j] + 1;
        printf("%5d", m[i][j]);
    }
    return 0;
}

Чья компиляция возвращает следующие ошибки:

main.c: 20: 5: предупреждение: передача аргумента 1 из 'f' делает указатель изцелое число без приведения [-> Wint-преобразование]
main.c: 13: 8: примечание: ожидаемое «int **», но аргумент имеет тип «int»
main.c: 21: 5: предупреждение: передача аргумента 1 из 'f' делает указатель из целого числа без приведения [-> Wint-преобразование]
main.c: 13: 8: примечание: ожидается int **, но аргумент имеет тип 'int'
Ошибка сегментации (ядро сброшено)

1 Ответ

1 голос
/ 23 октября 2019

Хотя многомерные массивы уже давно являются гражданами второго сорта в C, современные версии дают им гораздо лучшую поддержку. Если размеры массива включены до фактического массива в список параметров функции, они могут формировать измерения этого массива. Обратите внимание, что A и B теперь являются последним параметром для функции f():

void f(int w, int h, int m[w][h]);

int main()
{
  int A[3][3]={{1,2,3},{4,5, 6},{7,8,9}};
  int B[3][2]={{1,2},{3, 4}, {5, 6}};

  f(3, 3, A);
  f(3, 2, B);

  return 0;
}

void f(int w, int h, int m[w][h])
{
    int n[w][h];

    int i, j;

    for(int i;i<w;i++)
    {
      for(int j;j<h;j++)
        n[i][j] = m[i][j] + 1;
      printf("%5d", m[i][j]);
    }
}

Я не помню, какая версия C ввела это, но дляубедитесь, что параметр int **m указан неверно, поскольку m не является указателем на указатель (или массив указателей).

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

...