33 votes

Point-virgule sur les paramètres de ma fonction en 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;
}
 

Exemple de ma matrice de test

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

Je suis un peu perdu, je ne peux pas comprendre ce qui est "int n;" dans ma déclaration d'argument, cela fonctionne sur C mais C ++ n'autorise pas cette implémentation. Je veux comprendre comment cela fonctionne, car je vais migrer ce code vers c ++. Merci

40voto

Dietrich Epp Points 72865

Il est rarement utilisé la fonctionnalité de C99 extension GNU (GCC documentation) qui est utilisé pour déclarer les paramètres utilisés dans le VLA declarators.

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

Voyez-vous comment int n apparaît deux fois? La première int n; est juste une déclaration anticipée de la réelle int n, ce qui est à la fin. Il doit comparaître devant double a[][n] car n est utilisé dans la déclaration d' a. Si vous étiez d'accord avec réorganisant les paramètres, vous pouvez simplement mettre n avant a et puis vous n'avez pas besoin de cette fonctionnalité

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

Note sur le C++ de compatibilité

Pour être clair, l'extension GNU est juste à l' avant de la déclaration des paramètres de la fonction. Le prototype suivant est le standard de C:

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

Vous ne pouvez pas appeler cette fonction à partir de C++, parce que ce code utilise des tableaux de longueur variable, qui ne sont pas pris en charge en C++. Il vous faudrait réécrire la fonction afin de pouvoir l'appeler à partir de C++.

2voto

Flexo Points 39273

Si c'est ainsi que vous l'appelez toujours depuis C (c'est-à-dire avec n et m fixes à la compilation), alors en C ++, vous pouvez faire:

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

qui a N et M comme paramètres de modèle et ceux-ci sont déduits automatiquement lors de la compilation de l’entrée passée à la fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X