Подтвердить что ты не робот

Точка с запятой по моим параметрам функции в C

matrix_* matrix_insert_values(int n; double a[][n], int m, int n)
{
    matrix_* x = matrix_new(m, n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            x->v[i][j] = a[i][j];
    return x;
}

Пример моей тестовой матрицы

double in[][3] = {
    { 12, -51,   4},
    {  6, 167, -68},
    { -4,  24, -41},
    { -1, 1, 0},
    { 2, 0, 3},
};

Я немного потерял, я не могу понять, что такое "int n"; внутри моего объявления аргумента, он работает над C, но С++ не позволяет эту реализацию. Я хочу понять, как это работает, потому что я собираюсь перенести этот код на С++. Благодаря

4b9b3361

Ответ 1

Это редко используемая функция из расширения C99 GNU (документация GCC), которая используется для пересылки-объявления параметров, используемых в VLA declarators.

matrix_* matrix_insert_values(int n; double a[][n], int m, int n);

Вы видите, как int n появляется дважды? Первый int n; является просто прямым объявлением фактического int n, которое находится в конце. Он должен появляться перед double a[][n], потому что n используется в объявлении a. Если бы вы были в порядке с переупорядочиванием параметров, вы могли бы просто положить n до a, а затем вам не понадобится эта функция

matrix_* matrix_insert_values_rearranged(int m, int n, double a[][n]);

Примечание о совместимости с С++

Чтобы быть ясным, расширение GNU является просто декларацией параметров функции. Следующим прототипом является стандарт C:

// standard C, but invalid C++
matrix_* matrix_insert_values_2(int m, int n, double a[][n]);

Вы не можете вызывать эту функцию из С++, потому что этот код использует массивы переменной длины, которые не поддерживаются в С++. Вам нужно будет переписать функцию, чтобы иметь возможность вызвать ее из С++.

Ответ 2

Если вы так называете это из C (т.е. с n и m фиксированным во время компиляции), то в С++ вы можете сделать:

template <int N, int M>
void matrix_insert_values(const double (&a)[M][N]);

int main() {
  double in[5][3] = {
    { 12, -51,   4},
    {  6, 167, -68},
    { -4,  24, -41},
    { -1, 1, 0},
    { 2, 0, 3},
  };

  matrix_insert_values(in);
};

который имеет N и M как параметры шаблона, и они выводятся автоматически во время компиляции с входа, переданного функции.