Partage
  • Partager sur Facebook
  • Partager sur Twitter

assignment to expression with array type

    3 avril 2016 à 11:40:20

    Bonjour,

    je débute en C, j'ai beau regardé sur les différents sujets du langage C je n'ai pas trouvé de solutions a mon problème.

    Mon programme est censé initalisé une matrice.

    Pouvez vous m'aider ? merci! :)

    Voici ma fonction:

    int**  initialiserGraphe (int n, int m)
    {
        int g[n][m];
        int i,j;
        for (i=0;i<n;i++)
        {
            for (j=0;j<m;j++)
            {
                g[i][j]=0;//matrice initialisée
            }
        }
        return g;
    }

    voici mon programme principal:

    int main(int argc, char const *argv[])
    {
        int n,m,i,j;
        n=m=10;
        int g[n][m];
        g = (initialiserGraphe(n,m));
        for(i=0; i<n; i++)
        {
            for(j=0; j<m; j++)
            {
                printf("%d ",g[i][j]);
            }
            printf("\n");
        }
        return 0;
    }

    et quand je compile, j'obtiens ceci:

    projet.c: In function ‘initialiserGraphe’:
    projet.c:19:2: warning: return from incompatible pointer type
      return g;
      ^
    projet.c:19:2: warning: function returns address of local variable [-Wreturn-local-addr]
    gcc -Wall -g -o test-projet test-projet.c
    test-projet.c: In function ‘main’:
    test-projet.c:14:4: error: assignment to expression with array type
      g = (initialiserGraphe(n,m));
        ^
    Makefile:8: recipe for target 'test-projet.o' failed
    make: *** [test-projet.o] Error 1

    Voila. Ca fait maintenant un non bout de temps que je tourne en rond sans pouvoir résoudre ce problème.

    Quelqu'un aurait-il une possible solution? Merci beaucoup! :)

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      3 avril 2016 à 12:03:20

      Salut,
      je te conseille de voir ce tuto.

      Premièrement, en C, un tableau ne peut pas être assigné. Ce code est interdit:

      int t[5] = {0};
      int d[5] = t; // error

      Deuxièmement, une fonction n'a pas le droit de renvoyer un tableau:

      int f(void) [6]
      {
          int t[6];
          return t; // error
      } 

      On peut bidouiller avec les conversions implicites du langage C en faisant:

      int* f(void)
      {
          int t[5] = { 0 };
          return t; // no error
      }
      

      En revanche, ce code est aussi problématique, car:

      • Comme les tableaux ne peuvent pas être copiés, dès qu'ils sont passé en paramètres, ils sont passés par référence. Donc quand tu renvois "t" dans le code ci-dessus, l'adresse du premier élément est renvoyé. Cependant, "t" est local à la fonction f(): il est détruit après le return, et quand tu le réceptionnes avec un pointeur et l'utilises, le programme crashera lamentablement.
      • Un tableau est convertible implicitement en pointeur. Ce n'est pas le cas d'un tableau à plusieurs dimensions:
        int main(void)
        {
            int t[5][5];
            int **p = t; // warning, incompatible types
        
            return 0;
        }
        et dès que tu tentes d'utiliser p, le programme te produira des effets inattendu, comme planter, par exemple(*).

      Deuxièmement, la norme du C89 t'interdit les tableaux dépendant de la taille d'une variable. Les normes du C99 et C11 te le permettent.
      Une des meilleurs solutions serais de passer le tableau en paramètre, ou d'utiliser l'allocation dynamique. Cependant, la syntaxe pour réceptionner un tableaux multidimensionnel en paramètre se trouve ici.

      (*) En fait, ce n'est pas tout à fait vrai. On  peut réceptionner un tableaux multidimensionnel via un pointeur sur pointeur, mais c'est du bricolage et ce n'est pas une chose aisée. 

      -
      Edité par Anonyme 3 avril 2016 à 12:09:08

      • Partager sur Facebook
      • Partager sur Twitter
        3 avril 2016 à 17:03:36

        Ilearn32 a écrit:

        Un tableau est convertible implicitement en pointeur. Ce n'est pas le cas d'un tableau à plusieurs dimensions:

        • int main(void)
          {
              int t[5][5];
              int **p = t; // warning, incompatible types
          
              return 0;
          }

        Ben si, un tableau de tableaux se convertit en pointeur sur le premier élément comme tout autre tableau. Il suffit d'utiliser le bon type:

        int main(void)
        {
            int t[5][5];
            int (*p)[5] = t;
         
            return 0;
        }




        -
        Edité par Marc Mongenet 3 avril 2016 à 17:04:22

        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2017 à 15:53:34

          Alerte !! Je ne comprend pas ce messages d'erreur:

          assignment to expression with array type

          Pouvez vous m'aider svp!

          -
          Edité par OusmaneMballo 19 novembre 2017 à 16:14:40

          • Partager sur Facebook
          • Partager sur Twitter
            19 novembre 2017 à 16:07:31

            /!\  Alerte !  Libellé de l'erreur : Remonter de sujet ancien !  

            Peut être résolu en lisant les règle du forum.

            • Partager sur Facebook
            • Partager sur Twitter

            assignment to expression with array type

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown