c++ - una - tipos de funciones en c
Semicolon en mis parámetros de función en C (2)
Es una característica poco utilizada de la extensión C99 GNU ( documentación de GCC ) que se utiliza para reenviar-declarar los parámetros utilizados en los declaradores de VLA.
matrix_* matrix_insert_values(int n; double a[][n], int m, int n);
¿Ves cómo int n
aparece dos veces? La primera int n;
es solo una declaración directa de la int n
real, que está al final. Tiene que aparecer antes del double a[][n]
porque n
se usa en la declaración de a
. Si está de acuerdo con la reorganización de los parámetros, puede poner n
antes de a
y luego no necesitaría esta función
matrix_* matrix_insert_values_rearranged(int m, int n, double a[][n]);
Nota sobre compatibilidad C ++
Para que quede claro, la extensión GNU es solo la declaración directa de los parámetros de la función. El siguiente prototipo es estándar C:
// standard C, but invalid C++
matrix_* matrix_insert_values_2(int m, int n, double a[][n]);
No puede llamar a esta función desde C ++, porque este código usa matrices de longitud variable, que no son compatibles con C ++. Debería reescribir la función para poder llamarla desde 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;
}
Ejemplo de mi matriz de prueba
double in[][3] = {
{ 12, -51, 4},
{ 6, 167, -68},
{ -4, 24, -41},
{ -1, 1, 0},
{ 2, 0, 3},
};
Estoy un poco perdido, no puedo entender qué es "int n" dentro de mi declaración de argumento, funciona sobre C pero C ++ no permite esta implementación. Quiero entender cómo funciona esto porque voy a migrar este código a c ++. Gracias
Si así es como lo llamas desde C siempre (es decir, con n y m corregidos en tiempo de compilación), entonces en C ++ puedes hacer:
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);
};
que tiene N y M como parámetros de plantilla y estos se deducen automáticamente en tiempo de compilación a partir de la entrada que se pasa a la función.