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 :

Problème désallocation de tableau sous Visual C++ Express 2010


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut Problème désallocation de tableau sous Visual C++ Express 2010
    Bonsoir, j'ai une erreur que je n'arrive pas à comprendre avec ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    float * participationIntervenants = new float(nombreIntervenants);
    for(int i = 0; i < nombreIntervenants ; i++)
        {
            cout << "Combien a paye en euros " << nomsIntervenants[i] << " ? " << endl;
            cin >> participationIntervenants[i];
        }
     
    delete [] participationIntervenants;
    L'erreur se déclare après le delete[] et le message est indiqué dans la capture d'écran en pièce jointe (bug après delete.jpg).

    Dans la fenêtre de sortie du debug j'ai les messages suivants:

    \Users\Pierre\Documents\Visual Studio 2010\Projects\PartageDeFrais\Debug\PartageDeFrais.exe', Les symboles ont été chargés.
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\msvcp100d.dll', Les symboles ont été chargés.
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\msvcr100d.dll', Les symboles ont été chargés.
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\user32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\gdi32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\imm32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\msctf.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\uxtheme.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Program Files (x86)\Common Files\Microsoft Shared\Ink\tiptsf.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\combase.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\sspicli.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\cryptbase.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\sechost.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\bcryptprimitives.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\oleaut32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Program Files (x86)\McAfee\SiteAdvisor\sahook.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\advapi32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\ole32.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\dwmapi.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\oleacc.dll', Cannot find or open the PDB file
    'PartageDeFrais.exe'*: Chargé 'C:\Windows\SysWOW64\clbcatq.dll', Cannot find or open the PDB file
    Cela vient-il des dll non chargées ou cela n'a rien à voir.

    Je suis sous Windows 8 avec Visual C++ express 2010.
    Visiblement ce problème de chargement de dll est connu chez pas mal de monde qui utilise Visual C++ Express 2010 d'après un bref passage dans les forums...

    Merci de m'aider c'est vraiment important.
    Images attachées Images attachées  

  2. #2
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Bonsoir, le problème est qu'à aucun moment tu ne créés de tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float * participationIntervenants = new float(nombreIntervenants);
    Ceci te créer un pointeur sur UN float.

    Il te faut un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float nomIntervenant * [ nbrIntervenant ];
    Puis créer dynamiquement dans une boucle tes intervenants.


    Mais beaucoup mieux, simple aussi, regarde du côté des Containers si tu comptes faire des tableaux.

    #edit
    Meh ? Je pense que tu t'es laissé emporter
    Et pas qu'un peut... Les étoiles montent à la tête ?!

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour et bienvenue sur le forum

    Et bien fait pour toi, ça t'apprendras à pas faire du C++ moderne
    N'utilise pas new, pas de pointeur, pas de tableau style-C
    Utilise std::vector, std::list, etc

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Bonsoir, le problème est qu'à aucun moment tu ne créés de tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float * participationIntervenants = new float(nombreIntervenants);
    Ceci te créer un pointeur sur UN float.

    Il te faut un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float nomIntervenant * [ nbrIntervenant ];
    Puis créer dynamiquement dans une boucle tes intervenants.

    Mais beaucoup mieux, simple aussi, regarde du côté des Containers si tu comptes faire des tableaux.
    Meh ? Je pense que tu t'es laissé emporter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    float * participationIntervenant = new float[nbIntervenants];
    Suffira. Point n'est besoin de créer un tableau de pointeurs, sachant que la variable qui reçoit la mémoire allouée n'est qu'un pointeur - et non pas un pointeur sur pointeur

    Ceci dit, c'est encore plus simple comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<float> participationIntervenants(nbIntervenants);
    Ca fait la même chose, mais en plus on a plus besoin du delete []
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut
    Merci bcp.
    J'ai posté un message tout à l'heure car effectivement je me suis rendu compte qu'il fallait utiliser des crochets et non des parenthèses, par contre je ne sais pas où est parti ce message, je ne le vois pas dans a conversation.

    Maintenant je me pose la même question pour un tableau de float à 2 dimensions.

    Ca me paraît compliqué d'utiliser new.

    J'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float ** sommeDue;
    	sommeDue = (float **)malloc(nombreIntervenants * sizeof(float *));
    	for(int i = 0; i < nombreIntervenants ; i++)
    		sommeDue[i] = (float *)malloc(nombreIntervenants * sizeof(float));
    ou peut-être faut il faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float sommeDue ** [ nbrIntervenant ][ nbrIntervenant ];
    mais avec les vector, je fais comment??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<float><float> sommeDue(nbIntervenants, nbIntervenants);
    ??

    Je testerai demain.

    Pour les DLL je n'ai pas de réponse mais ça n'empêche pas la génération du projet, et je crois que ce serait mieux dans un autre post.

    Merci :-)

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut
    Pratique aussi ces <vector>, parce qu'en double dimension je fais un delete[] comme ça, ce qui est un peu pénible ;-)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(int i=0; i<nombreIntervenants; i++)
    		delete [] sommeDue[i];
    delete [] sommeDue;
    Reste effectivement à savoir quelle syntaxe utiliser pour des <vector> à 2 dimensions...

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Pierrot94110 Voir le message
    Reste effectivement à savoir quelle syntaxe utiliser pour des <vector> à 2 dimensions...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::vector<double> >
    Mais, je ne te donne cette syntaxe que parce que tu sembles vouloir créer un tableaux des sommes dues par chaque participant, et que je me dis qu'il n'est pas impossible que chaque participant se retrouve avec un nombre de sommes dues différent de son voisin

    Ceci dit, étant donné qu'il y aura surement d'autres informations sur les participants (leur nom, et que sais-je d'autre), une petite structure Participants, contenant, entre autres, le tableau des sommes dues serait très certainement préférable dans le sens où il me semble que les différentes informations "iraient bien ensemble"

    Je verrais donc bien quelque chose comme (j'utilise des structures et quelques fonctions membres, par facilité, mais une approche plus OO ne sera pas du luxe )

    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
    struct Participant
    {
        Participant(std::string const & nom=):nom(nom){}
        std::string nom;
        std::vector<double> sommesDues;
        /* calcule le total de toutes les sommes dues */
        double totalDu() const 
        {
            double total = 0.0;
            /* C++11 only */
            for (auto it : sommesDues)
                total +=it;
            /* ou bien (toutes version de C++ confondues) */
            double sum = std::accumulate(sommesDues.begin(), sommesDues.end(), 0.0);
            return sum;
        }
    };
    que tu pourrais alors utiliser dans un tableau sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
        std::vector<Participant> tab;
        tab.push_back(Participant("Henry"));
        tab.push_back(Participant("Charles"));
        tab.push_back(Participant("Philippe"));
        tab.push_back(Participant("Edmond"));
        tab.push_back(Participant("Louis"));
        tab.push_back(Participant("Caroline"));
        tab.push_back(Participant("Annick"));
        tab.push_back(Participant("Isabelle"));
        tab.push_back(Participant("Frédéric"));
        tab[3].sommesDues.push_back(21.32); // rajoute 21.32 aux sommes dues par Edmond
    }
    Mais, dans cet ordre d'idée, une std::map (c'est un conteneur associatif entre une clé et une valeur) pour laquelle la clé correspondrait au nom du participant serait sans doute encore plus intéressant, nous permettant de retrouver facilement le participant en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
        std::map<std::stringParticipant> tab;
        tab["Henry"]= Participant("Henry");
        tab["Charles"]= Participant("Charles");
        tab["Philippe"]= Participant("Philippe");
        tab["Edmond"]= Participant("Edmond");
        tab["Louis"]= Participant("Louis");
        tab["Caroline"]= Participant("Caroline");
        tab["Annick"]= Participant("Annick");
        tab["Isabelle"]= Participant("Isabelle");
        tab["Frédéric"]= Participant("Frédéric");
        tab["Edmond"].sommesDues.push_back(21.32); // rajoute 21.32 aux sommes dues par Edmond
    }
    Et parce que, dés que j'entends parler de tableau à dimensions multiples, je ne peux m'empêcher de le faire:

    Il est particulièrement intéressant de constater que, lorsque tu as un tableau deux dimensions de L lignes et de C colonnes, tu te retrouves en réalité avec un tableau contenant L * C éléments.

    Tu pourrais donc parfaitement envisager de créer un tableau n'ayant qu'une seule dimension mais contenant L * C éléments

    Pour accéder à l'élément qui se trouve à la ligne Li et à la colonne Co, il "suffirait" d'accéder à l'élément dont l'index correspond à la formule index = LI * C + Co.

    Ce ne sera, en tout état de cause, jamais plus lent que de travailler avec un tableau 2D, mais cela peut, dans certains cas, être plus rapide

    Cela ne peut cependant fonctionner que si chaque ligne est composé du même nombre de colonnes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  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
    Bonjour,
    Citation Envoyé par Pierrot94110 Voir le message
    Pour les DLL je n'ai pas de réponse mais ça n'empêche pas la génération du projet, et je crois que ce serait mieux dans un autre post.
    Il n'y a aucun problème avec les DLL, tu compiles en Debug et ne possèdes pas les pdb correspondant à ces DLL.
    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 habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mars 2013
    Messages : 11
    Par défaut
    Merci pour tous ces conseils, je vais tâcher de les mettre en application...
    Pour les DLL j'ai ouvert un autre post, mais que signifie posséder ou non les pdb svp???
    Quel est leur lien avec les DLL en question?

    Je suis curieux :-)

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    PDB (Program DataBase) ce sont les informations de débogage.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/08/2014, 08h35
  2. Problème lors du débogage sous Visual Studio Express 2012
    Par mutb27 dans le forum Visual Studio
    Réponses: 0
    Dernier message: 13/04/2014, 21h12
  3. Vue Design sous Visual Studio Express 2010
    Par gunbol dans le forum Débuter
    Réponses: 5
    Dernier message: 03/02/2011, 00h35
  4. problèmes avec un dialogue sous visual 2002
    Par twinseb dans le forum MFC
    Réponses: 3
    Dernier message: 29/11/2006, 15h59
  5. [GTK] Sous visual c++ express
    Par k_boy dans le forum MFC
    Réponses: 7
    Dernier message: 01/04/2006, 21h16

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