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 ++. Спасибо
Это редко используется особенность от 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]);
Чтобы быть ясным, расширение GNU это просто предварительная декларация параметров функции. Следующий прототип является стандартным C:
// standard C, but invalid C++
matrix_* matrix_insert_values_2(int m, int n, double a[][n]);
Вы не можете вызвать эту функцию из C ++, потому что этот код использует массивы переменной длины, которые не поддерживаются в C ++. Вы должны были бы переписать функцию, чтобы иметь возможность вызывать ее из C ++.
Если это то, как вы вызываете его из 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 в качестве параметров шаблона, и они автоматически выводятся во время компиляции из входных данных, переданных в функцию.