Partage
  • Partager sur Facebook
  • Partager sur Twitter

is used uninitialized in this function [-Wuninit

comment initialiser ma structure ?

Sujet résolu
    14 décembre 2018 à 23:22:51

    Bonsoir ! Désolé de vous déranger...

     quand je compile sur ubuntu j'ai ce warning (sur windows tout fonctionne bien):

     warning: ‘N’ is used uninitialized in this function [-Wuninitialized] 

       N->m = M->n; 

    typedef struct Matrice Matrice;
    struct Matrice
    {
    	int m,
    		n;
    	double *v;
    };
    
    
    
    
    Matrice *transpose(Matrice *M) // on transpose une matrice
    {
      int i,j ;
      Matrice *N;
      N->m = M->n;
      N->n = M->m;
      N->v = malloc(N->m*N->n*sizeof(double));
      for (i = 0; i < M->n; i++)
    
        {
          for (j = 0; j < M->m; j++)
            {
                N->v[(i * M->m) + j] = M->v[(j * M->n) + i];
            }
        }
      return N;
    }
    
    

    comment résoudre le problème ?

    Je ne sais pas initialiser la structure comme elle est personnalisée

    Merci d'avance :)



    -
    Edité par PierreVana 14 décembre 2018 à 23:25:48

    • Partager sur Facebook
    • Partager sur Twitter
      14 décembre 2018 à 23:29:29

      Hello,

      Ligne 16: que vaut N ? On n'en sait rien, N n'est pas initialisé (pas de malloc())

      PierreVana a écrit:

      (sur windows tout fonctionne bien)

      Question d'options du compilateur: le problème est le même sous windows.
      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        14 décembre 2018 à 23:36:28

        je voudrais que N soit juste une matrice que je remplisse au fur et à mesure de la fonction ! 

        Du coup pour moi N est un pointeur vers une matrice vide non ?

        -
        Edité par PierreVana 14 décembre 2018 à 23:41:56

        • Partager sur Facebook
        • Partager sur Twitter
          15 décembre 2018 à 0:19:17

          Non. N pointe sur une adresse en mémoire, mais laquelle ?

          Comment as-tu fais pour M ?

          -
          Edité par edgarjacobs 15 décembre 2018 à 0:21:15

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            15 décembre 2018 à 13:40:22

            M est juste une matrice. je fais donc transpose(&M)

            Merci de tes réponses grâce à toi j'ai réussi à contourner le problème :

            je remplace :

            Matrice *N;

            par 

            Matrice P;
            Matrice *N = &P;

            mais pourquoi quand on créé un pointeur sur un int comme:

            int *a;

            ça marche bien mais pas pour un type personnalisé ?

            • Partager sur Facebook
            • Partager sur Twitter
              15 décembre 2018 à 14:15:52

              Non : int* a; est un pointeur et ne doit pas être déréférencé s'il n'a pas été initialisé sur une adresse existante.

              • Partager sur Facebook
              • Partager sur Twitter

              En recherche d'emploi.

                15 décembre 2018 à 16:57:02

                Mais pourquoi, saperlipopette, veux-tu absolument utiliser un pointeur ? Ça fait plus je-m-y-connais ?

                Tu n'a vraiment pas besoin d'un pointeur ! Utillise P.n, P.m et P.v ! Pourquoi te faire ch.... à faire *N=P et N->n, N->m et N->v ?

                -
                Edité par edgarjacobs 15 décembre 2018 à 16:58:59

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  17 décembre 2018 à 20:02:12

                  C'est dans l'énoncé je dois rendre un pointeur sur matrice ... tu penses qu'en faisant P.n etc et si je retourne &P ça marche ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 décembre 2018 à 20:25:01

                    PierreVana a écrit:

                    C'est dans l'énoncé je dois rendre un pointeur sur matrice ... tu penses qu'en faisant P.n etc et si je retourne &P ça marche ?

                    Ah, voilà une information supplémentaire. Et non, retrounrer l'adresse de P ne fonctionnera pas: P est une variable locale à la fonction, et donc détruite à la fin de la fonction.

                    Mais ceci va fonctionner

                    Matrice *transpose(Matrice *M) {
                    	....
                    	Matrice *N;
                    
                    	N=malloc(sizeof(*matrice));		// ou malloc(sizeo(Matrice))
                    	N->m = M->n;
                    	....
                    	
                    	return N;
                    }

                    A l'appelant de tout libérer.

                    -
                    Edité par edgarjacobs 17 décembre 2018 à 20:25:26

                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      17 décembre 2018 à 20:48:55

                      Non,

                      Une fonction ne doit jamais retourner l'adresse d'un variable interne, car on aurait un pointeur sur une variable qui n'existe plus (dangling pointer).
                      S'il faut retourner une zone pointable c'est qu'elle doit être allouée. En changeant la ligne 15 par : 

                      Matrice *N = malloc(sizeof(Matrice));

                      Il y aura alors besoin de 2 free() pour libérer cette matrice.

                      grilled

                      -
                      Edité par Dalfab 17 décembre 2018 à 20:55:00

                      • Partager sur Facebook
                      • Partager sur Twitter

                      En recherche d'emploi.

                        18 décembre 2018 à 0:49:00

                        Merci beaucoup pour vos réponses ! j'ai beaucoup mieux compris l'initialisation des pointeurs :)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        is used uninitialized in this function [-Wuninit

                        × 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