Partage
  • Partager sur Facebook
  • Partager sur Twitter

allocation dynamiques

dans une fonction

Sujet résolu
    4 mai 2008 à 19:19:57

    bonjour a tous

    voila j'ai un problème j'essaille de crée une fonction qui ferai une allocation dynamique que je puisse récupérer dans la fonction main.
    je crée donc un pointeur dans le main que j'envoie a la fonction "alloc" mais sa ne fonctionne pas, je n'arrive pas a récupérer le tableau crée.

    voici le code:

    #include <iostream>
    
    using namespace std;
    
    void alloc (long *test);
    
    int main()
    {
        long *test = NULL;
    
        alloc (test);
        printf ("%ld",test);
        return 0;
    }
    
    void alloc (long *test)
    {
        test = new long[4];
    }
    


    si quelqun avait la solution a mon problème sa m'aiderai beaucoup.

    merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2008 à 19:33:18

      - tu n'arrive pas à recupérer, c'est à dire ?
      - ici, on est en C++ (printf())
      - je ne vois pas d'interet à ta fonction
      • Partager sur Facebook
      • Partager sur Twitter
        4 mai 2008 à 19:34:36

        Ton code marche parfaitement au niveau de l'allocation, c'est au niveau de l'affichage que tu plante !

        Je te conseille de (re)lire le tuto sur les flux de m@théo [Chapitre 2 du C++]

        Ensuite, on affiche un tableau par une boucle
        for( int i= 0 ; i < 4 ; ++i )
        {
            std::cout << test[i] << std::endl;
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          4 mai 2008 à 20:36:51

          merci de vos réponse

          - tu n'arrive pas à recupérer, c'est à dire ?

          quand je veut récupérer par exemple "test[2]" dans une autre variable ou l'afficher il y a une erreur et le programme se ferme

          ex si je fait
          #include <iostream>
          
          using namespace std;
          
          void alloc (long *test);
          
          int main()
          {
              long *test = NULL;
          
              alloc (test);
              cout << test[2] << endl;
              return 0;
          }
          
          void alloc (long *test)
          {
              test = new long[4];
          }
          


          - ici, on est en C++ (printf())

          corriger

          - je ne vois pas d'interet à ta fonction

          en fait c'est juste une fonction d'exemple pour exposer mon problème la vrai fonction ou j'ai se problème fait plus de 300 ligne de code je ne voulais pas afficher sa sur le forum

          - Ton code marche parfaitement au niveau de l'allocation, c'est au niveau de l'affichage que tu plante !

          pas que sa quand quand je transfère test[2] a une autre variable le programme plante aussi.


          merci de votre aide.
          • Partager sur Facebook
          • Partager sur Twitter
            4 mai 2008 à 20:41:13

            Donne nous le bon code minimal ET l'erreur, car moi, je compile ton code :

            -------------- Build: Release in testeur ---------------
            
            Compiling: main.cpp
            Process terminated with status 0 (0 minutes, 3 seconds)
            0 errors, 0 warnings

            GCC avec code::Blocks sous linux....
            Verifie avec un autre compilateur sinon ;)
            • Partager sur Facebook
            • Partager sur Twitter
              4 mai 2008 à 20:54:00

              Citation : one-line

              #include <iostream>
              
              using namespace std;
              
              void alloc (long *test);
              
              int main()
              {
                  long *test = NULL;
              
                  alloc (test);
                  cout << test[2] << endl;
                  return 0;
              }
              
              void alloc (long *test)
              {
                  test = new long[4];
              }
              


              ce code est valide, sauf qu'il manque un delete[].
              sinon m'es avis qu'un std::vector serait plus simple
              • Partager sur Facebook
              • Partager sur Twitter
                4 mai 2008 à 23:05:04

                en fait c'est a l'exécution que le programme plante.

                mais je connaissait pas std::vector et je pense que je trouverai comment faire ce que je veut avec.

                merci de m'avoir aider.
                • Partager sur Facebook
                • Partager sur Twitter
                  5 mai 2008 à 13:47:11

                  Ton pointeur est passé par valeur. Pour récupérer la mémoire allouée par la fonction alloc, il faut le passer par référence

                  void alloc (long * & test)
                  {
                     test = new long[4];
                  }
                  
                  int main()
                  {
                     long * test = 0;
                     alloc(test);
                     /* ... */
                  }
                  


                  ou bien à la mode C

                  void alloc (long ** test)
                  {
                     *test = new long[4];
                  }
                  
                  int main()
                  {
                     long * test = 0;
                     alloc(&test);
                     /* .... */
                  }
                  


                  ou encore le retourner

                  long * alloc(void)
                  {
                     return new long[4];
                  }
                  
                  int main()
                  {
                     long * test = alloc();
                     /* .... */
                  }
                  


                  • Partager sur Facebook
                  • Partager sur Twitter
                  Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                  allocation dynamiques

                  × 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