Точка с запятой на моих параметрах функции в 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, но C ++ не позволяет эту реализацию. Я хочу понять, как это работает, потому что я собираюсь перенести этот код на c ++. Спасибо

32

Решение

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

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]);

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

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

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

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

41

Другие решения

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

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 в качестве параметров шаблона, и они автоматически выводятся во время компиляции из входных данных, переданных в функцию.

2

По вопросам рекламы [email protected]