IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Allocation dynamique dans une fonction


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Allocation dynamique dans une fonction
    Bonjour.

    J'ai un problème avec lequel j'ai un peu de mal.
    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    void mafonction(unsigned long long int par_min64[],unsigned long long int par_max64[])
    {
            par_min64=new unsigned long long int[1];
            par_max64=new unsigned long long int[1];
            par_min64[0]=2;
            par_max64[0]=3;
    } 
     
    int main()
    {
        unsigned long long int *par_min64;
        unsigned long long int *par_max64;
     
        mafonction(par_min64,par_max64);
     
        std::cout<<" "<<par_min64[0]<<" "<<par_max64[0];
     
        delete[] par_min64;
        delete[] par_max64;
     
        return 0;
    }
    Cela plante et je n'arrive pas bien à comprendre pourquoi.
    Comment allouer dynamiquement mes tableaux dans ma fonction et les récupérer à l'extérieur ?
    Merci ;-)

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    C'est peut-etre une histoire de pointeur et de passage de paramètre (si c'est le cout qui plante) vu que tu alloues dans la fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void mafonction(unsigned long long int *par_min64[],unsigned long long int *par_max64[])
    {
            *par_min64=new unsigned long long int[1];
            *par_max64=new unsigned long long int[1];
            (*par_min64)[0]=2;
            (*par_max64)[0]=3;
    } 
     
    int main()
    {
        unsigned long long int *par_min64;
        unsigned long long int *par_max64;
     
        mafonction(&par_min64,&par_max64);
     
        std::cout<<" "<<par_min64[0]<<" "<<par_max64[0];

  3. #3
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,
    il faut que ta fonction retourne les deux pointeurs sur les tableaux crées, sinon, leurs adresses sont perdues, mais continuent à occuper de la mémoire inutilement!!! De plus, puisque les tableaux sont crées par ta fonction, il est plus simple de ne pas les mettre en paramètres. En plus un compilo comme VisualC++ ( que j'utilise ) plante à la compilation si on transmet en paramètre des pointeurs non initialisés!

    Je tenterai quelque chose comme ça pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    struct retourFonction
    {    unsigned long long int* pt1;
          unsigned long long int* pt2;
    };
     
    retourFonction mafonction()
    {
            par_min64=new unsigned long long int[1];
            par_max64=new unsigned long long int[1];
            par_min64[0]=2;
            par_max64[0]=3;
     
          retourFonction rF;
          rF.pt1 = par_min64;
          rF.pt2 = par_max64;
         return rF;
    } 
     
    int main()
    {
        unsigned long long int *par_min64;
        unsigned long long int *par_max64;
        retourFonction rF;
     
        rF = mafonction();
     
        std::cout<<" "<<rF.pt1[0]<<" "<<rF.pt2[0];
     
        delete[] rF.pt1;
        delete[] rF.pt2;
     
        return 0;
    }
    Ca peut marcher, je crois!

    PS : Si tu peux dire ce qui plante : compilation, éxécution, et le message d'erreur ça évite de répondre en 'aveugle' merci

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par bertry Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    struct retourFonction
    {    unsigned long long int* pt1;
          unsigned long long int* pt2;
    };
     
    retourFonction mafonction()
    {
            par_min64=new unsigned long long int[1];
            par_max64=new unsigned long long int[1];
            par_min64[0]=2;
            par_max64[0]=3;
     
          retourFonction rF;
          rF.pt1 = par_min64;
          rF.pt2 = par_max64;
         return rF;
    } 
     
    int main()
    {
        unsigned long long int *par_min64;
        unsigned long long int *par_max64;
        retourFonction rF;
     
        rF = mafonction();
     
        std::cout<<" "<<rF.pt1[0]<<" "<<rF.pt2[0];
     
        delete[] rF.pt1;
        delete[] rF.pt2;
     
        return 0;
    }
    Ca peut marcher, je crois!
    Ou pas !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    retourFonction mafonction()
    {
            .....
     
          retourFonction rF;
         ......
         return rF;
    }
    Je crains le pire au niveau retour de fonction. Retourner une variable déclarée localement, c'est source de gros problème.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Retourner une variable déclarée localement, c'est source de gros problème.
    ???????

    La variable va être simplement copiée ! (et donc les pointeurs aussi)
    Suffit voir l'implémentation (très) souvent conseillée des operateurs binaires, on retourne bien une variable 'locale'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MonType operator+(MonType const& a, MonType const& b)
    {
         MonType retour(a);
         retour += b;
         return retour;
    }

  6. #6
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Je suis d'accord avec Joe. Ca fait longtemps que je retourne des variables locales avec mes fonctions, et en général elles sont recopiées dans la variable qui la recueil...

  7. #7
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    C'est la fontaine des évidences ce topic

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par Kaluza Voir le message
    Cela plante et je n'arrive pas bien à comprendre pourquoi.
    Pour comprendre pourquoi, je t’invite à faire la chose suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << (int) par_min64 << ' ' << (int) par_max64;
    À divers endroits dans ton code :
    - avant l’appel à f
    - dans f, avant leur initialisation
    - dans f, après leur initialisation
    - après l’appel à f

    Tu devrais alors comprendre pourquoi ça plante, et trouver tout seul la correction à apporter.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Juste pour rappeler qu'en C++, utiliser directement des tableaux alloués dynamiquement est assez rare, on leur préfère généralement des conteneurs plus simples à gérer, comme std::vector.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. Allocation dynamique dans une fonction
    Par n0mad dans le forum Débuter
    Réponses: 5
    Dernier message: 05/02/2009, 22h42
  2. nombre des variables dynamique dans une fonction
    Par Abdelkaoui dans le forum C
    Réponses: 10
    Dernier message: 29/02/2008, 15h37
  3. [D7] - Allocation dynamique dans une DLL
    Par david_chardonnet dans le forum Delphi
    Réponses: 6
    Dernier message: 05/07/2006, 15h28
  4. declaration dynamique dans une fonction
    Par gronaze dans le forum C
    Réponses: 7
    Dernier message: 13/03/2006, 10h06
  5. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/04/2005, 15h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo