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

 C++ Discussion :

allocation de mémoire dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut allocation de mémoire dynamique
    Bonjour,
    Quelle différence y a t il entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int* tableau=0;
    tableau = new int [x*y];
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ** tableau =0;
    tableau = new  int* [x][y];
    Y a t il des différences au niveau de la mémoire ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Ton code est mauvais il y a 1 différence entre 0, NULL (qui vaut 0L) et nullptr.

    Et ensuite ton code tableau = new int* [x][y]; ne compile pas error: cannot convert 'int* (*)[2]' to 'int**' in assignment.

    Et ensuite ce genre de pointeur de pointeur int** tableau, il faut le contexte pour répondre SURTOUT EN C++ QUI A LA STL ET LES CONTAINERS
    Parce que pour moi ce pointeur permet de manipuler 1 tableau ou 1 autre pointeur de type int*, et notamment son allocation.

    Mais je pense aussi aux exercices , où on demande la différence entre 1 tableau 2d classique, et 1 autre tableau 1d et chaque pointeur est 1 tableau pour simuler 1 ligne (<- ce qui revient à 1 tableau 2d)

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Merci Fœtus de t'être penché sur ma question.
    Oui mon code ne compile pas parce que j'avais complètement zappé que la seconde dimension ne peut pas être une variable dans les tableaux dynamiques.

    En fait mon problème est que je me retrouve à devoir créer un nombre de tableaux encore inconnu au moment de la compilation.
    Par contre en fonction d'une variable qui apparaît au milieux du programme on peut savoir combien de tableaux on aura besoin AU MAXIMUM.
    Mais le nombre final de tableaux ne se précise qu'au fur et à mesure du déroulement du programme...

    Alors j'ai pense créer un mega grand tableau de la taille maximale possible, et m'y promener en utilisant les références x,y,z (x pour numéro de tableau, y et z pour les colonnes et les lignes)
    Le problème c'est la TAILLE de ce tableau... Qui nécessite de trouver dans la mémoire un espace libre consécutif énorme!
    C'est pourquoi je cherchais à savoir si en faisant un tableau de pointeurs sur pointeurs, peur être que chaque tableau prendrait alors une place à part...

    Sinon je n'ai pas bien compris
    n'est pas une bonne formule ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 766
    Par défaut
    Citation Envoyé par Legro Voir le message
    n'est pas une bonne formule ?
    Il faut utiliser la macro NULL parce qu'en fonction de la plateforme tu n'es pas sûr que 0 fasse 32bits (4 octets) ou 64bits (8 octets), la taille d'1 pointeur.
    Et ensuite depuis C+11, nullptr parce qu'il y a ambiguïté parce NULL reste 1 entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void func(int n); 
    void func(char* s);
     
    func(NULL); // guess which function gets called?

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Merci encore Fœtus.
    Je ne savais pas du tout qu'il pouvait y avoir un problème avec un pointeur sur zero. Je note bien.

    Pour mon problème j'ai enfin trouvé une solution toute simple : utiliser des pointeurs de vector.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<int>* tableau=nullptr;
    tableau=new vector<int>[nombreMaximalDeTableaux];
    tableau[x].push_back(variable);
    delete [] tableau; tableau=nullptr;
    Ca compile et ça marche!

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Legro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int* tableau=0;
    tableau = new int [x*y];
    Ce code est mauvais, mais compile.
    Citation Envoyé par Legro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int ** tableau =0;
    tableau = new  int* [x][y];
    Ce code est encore plus mauvais et ne compile même pas.

    La différence au niveau de la mémoire ? En quoi ça te concerne quand tu débutes clairement ? Tu veux économiser 2 octets pour ...?
    Apprends donc à utiliser std::vector et std::array.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Citation Envoyé par Bousk Voir le message
    La différence au niveau de la mémoire ? En quoi ça te concerne quand tu débutes clairement ? Tu veux économiser 2 octets pour ...?
    Je comprends ton étonnement; en fait ça me concerne dans la mesure où en ayant besoin d'utiliser des tableaux à plusieurs dimensions j'arrive très très vite à une des (nombreuses) limites de la mémoire.

    Citation Envoyé par Bousk Voir le message
    Apprends donc à utiliser std::vector et std::array.
    Merci, je les utilise depuis pas mal de temps, mais là j'étais coincé...
    Du coup j'ai fait un petit "mix" pointeur/vector, comme je l'ai écris à Fœtus, et pour cette fois ça à l'air de marcher.
    Merci à tous.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ce mix est la pire solution possible.
    Le pointeur n'a strictement rien à faire ici et absolument aucune utilité.
    std::vector::resize
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2017
    Messages : 34
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Le pointeur n'a strictement rien à faire ici et absolument aucune utilité.
    Dans l'absolu tu as certainement raison, mais dans mon cas le pointeur a une fine utilité :
    Je me retrouve dans certains cas extremes avec des tableaux qui contiennent 1024000000 éléments, ou plus. Si en plus je me mets à réunir plusieurs de ces tableaux dans un seul vector ça dépasse la capacité du PC non par manque de mémoire, mais par incapacité de donner une adresse tellement élevée à la suite du tableau (eh oui l'ordi ne sait pas compter jusqu'à l'infini). En faisant un pointeur de vector, et donc en séparant chaque tableau, j'évite tout simplement cet écueil.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Le principe du vector c'est de gérer le pointeur interne. Que le vector soit lui aussi un pointeur n'a absolument aucun intérêt dans ton cas - et dans l'immense majorité des cas.

    De toute évidence tu as des lacunes pour ce qui concerne la mémoire, les pointeurs et vector.
    Cadeau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vector<vector<int>> tableau;
    tableau.resize(nombreMaximalDeTableaux);
    tableau[x].push_back(variable);
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. mémoire dynamique des threads
    Par seb__ dans le forum C
    Réponses: 2
    Dernier message: 01/01/2007, 15h45
  2. déclaration de formulaire dynamique
    Par Glum147 dans le forum Struts 1
    Réponses: 2
    Dernier message: 07/11/2006, 14h59
  3. Utilisation de la mémoire dynamique
    Par Stany dans le forum Windows
    Réponses: 17
    Dernier message: 27/04/2006, 11h39
  4. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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