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 dynamique dans la bibliothèque Matrix.h


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut allocation dynamique dans la bibliothèque Matrix.h
    Bonjour, j'ai un problème avec l'allocation de mémoire, en fait je manipule un grand nombre de clients allant de 100 vers 1000
    j'utilise la bibliothèque Matrix.h et les matrices que je manipule sont de 3 dimensions, quand je teste avec 100 clients mon programme marche bien mais si je teste avec 132 il se bloque et m'affiche ce msg :
    Unhandled exception at 0x000007fefc9e9e5d in 05.exe: Microsoft C++ exception: Numeric_lib::Matrix_error at memory location 0x002ff500..

    je me demande comment on gére la mémoire suivant cette bibliothèque et comment je pourrais même supprimer des matrices pour désallouer la mémoire, ou comment inclure les pointeurs dans cette bibliothéque?
    merci de me répondre svp

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Utilisez le débogueur.
    "Matrix_error" doit contenir un champ avec des explications du problème.
    Peut-être une limitation de cette classe Matrix.

  3. #3
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    merci bacelar, mais j'ai pas compris svp pouvez vous detailler ce qu'il me faut faire

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    pouvez vous detailler ce qu'il me faut faire
    Utilisez le débogueur.
    Il faut que vous analysiez l'erreur grâce au débogueur.
    Le débogueur donne le code source où le problème a été détecté.
    C'est à vous de l'analyser.

  5. #5
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    J'ai deja trouvé ou l'erreur existe
    C'est la declaration d'un nouveau matrice a 3 dimension
    Car je fais pas l'allocation dynamique d'ou le probleme de memoire ....
    Je cherche juste comment utiliser les pointeurs dans les matrices
    J'ai pas trouvé des documentation sur ce dernier et merci

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Le code source, les valeur des variables et des champs de l'exception lancée, SVP ?

  7. #7
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Le code source, les valeur des variables et des champs de l'exception lancée, SVP ?
    je fais la lecture apartir d'un fichier, pour n=100 ça marche sans bug mais si n=131 voilà l'erreur ce qu'il s'affiche :



    Nom : 1.png
Affichages : 199
Taille : 61,4 Ko




    et après le débogage j'ai trouvé qu'a partir d'içi le bug :

    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
    //calcul de gain
    double gain;
    Matrix<int>nbr(n+1);
    Matrix<double,2>dis(n+1,n+1);
    Matrix<int,3>arc(n+1,n+3,n+3);
    Matrix<int>id(n+3);
    Matrix<int,3>mat(n+1,n+3,n+3);
     
    void calcgain(Matrix<int,1>&id, Matrix<int,1>&nbr, Matrix<double,2>&dis, Matrix<int,3>&arc, Matrix<int,3>&mat);
    { 
    	for(int s=1; s<=n; s++){
    			id(s)=0;
    			for(int i=1; i<=nbr(s)+1; i++){	
    				for(int j=i+1; j<=nbr(s)+1; j++){	
    					gain=(dis(arc(s,i,1),arc(s,j,1))+dis(arc(s,i,2),(arc(s,j,2))))-(dis(arc(s,i,1),arc(s,i,2))+dis(arc(s,j,1),arc(s,j,2)));
    					if(gain<0){
    								id(s)=id(s)+1;
    								mat(s,id(s),1)=arc(s,i,2);
    								mat(s,id(s),2)=arc(s,j,1);
    							  }
    									}
    											}
    													}
    															}

  8. #8
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    C'est une exception de la lib, tu as une callstack et même un message d'erreur, que tu nous a jamais retranscrit ici. Les as-tu lu toi-même ?
    L'indentation de ton code rejette toute tentative de lecture pour ma part.
    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
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    et comment faire pour corriger ça ?
    chui débutante et ce que je ne peux pas comprendre ce que si ce code n'est pas correcte comment pour n=100 il marche et me donne le résultat attendu?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    et comment faire pour corriger ça ?
    On commence par comprendre le problème avant de le corriger.
    Il faut donc que vous compreniez le problème.
    Pour cela, le débogueur est le meilleur allié.
    Le code de la librairie est en C ou en C++, comme le vôtre, vous devriez être en mesure de comprendre comment il fonctionne.

    ce que si ce code n'est pas correcte comment pour n=100 il marche et me donne le résultat attendu?
    Parce qu'il avait envi.
    Sérieusement, cela peut être une limitation de la librairie, de la taille de pile encore disponible, de l'âge du capitaine, de la couleur de la robe de sa fille, etc...

    Prenez la peine de prendre un peu de temps à maitrise le débugging pas à pas avec le débogueur.

    Le code que vous nous donnez, c'est le code qui construit la baffe (l'exception) qu'on se prend. L'explication du pourquoi est avant, donc utilisez les point d'arrêt et la pile d'appel pour savoir où ça par en couille.

  11. #11
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bacelar Voir le message
    On commence par comprendre le problème avant de le corriger.
    Il faut donc que vous compreniez le problème.
    Pour cela, le débogueur est le meilleur allié.
    Le code de la librairie est en C ou en C++, comme le vôtre, vous devriez être en mesure de comprendre comment il fonctionne.


    Parce qu'il avait envi.
    Sérieusement, cela peut être une limitation de la librairie, de la taille de pile encore disponible, de l'âge du capitaine, de la couleur de la robe de sa fille, etc...

    Prenez la peine de prendre un peu de temps à maitrise le débugging pas à pas avec le débogueur.

    Le code que vous nous donnez, c'est le code qui construit la baffe (l'exception) qu'on se prend. L'explication du pourquoi est avant, donc utilisez les point d'arrêt et la pile d'appel pour savoir où ça par en couille.
    merci bien, voilà ce que j'ai compris j'utilise les break points et le call stack pour trouver l'erreur ou est il , voilà une capture d'écran
    c'est comme ça???

    Nom : 2.png
Affichages : 187
Taille : 59,4 Ko

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Pas besoin de mettre autant de point d'arrêt.
    Faites du pas à pas à partir de la ligne qui plante.

  13. #13
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    il y a un nouveau msg qui s'affiche :

    Nom : 1.png
Affichages : 208
Taille : 55,8 Ko

  14. #14
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    bad_alloc, c'est un problème interne à l'allocation d'un bloc mémoire.
    La cause est généralement qu'il n'y a plus de mémoire allouable.
    La cause de la cause est généralement que le programme en utilise trop.
    La cause de la cause de la cause est généralement qu'il a oublié d'en rendre.

    Une variante c'est qu'il en consomme trop simultanément, mais c'est plus rare.

    Remonte plus haut dans la pile d'appel pour laquelle de tes fonctions crée une montagne de Matrix…
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  15. #15
    Candidat au Club
    Femme Profil pro
    optimisation
    Inscrit en
    Mars 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : optimisation

    Informations forums :
    Inscription : Mars 2017
    Messages : 13
    Points : 4
    Points
    4
    Par défaut
    je fais pas du graphe, je fais de l'optimisation mathématique et ce n'est pas a moi de choisir le nombre de variable ça dépend des instances du benchmark sur lesquelles on va testé

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Est-ce normal que tu tentes d'allouer près de 4Go d'un coup?
    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.

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Pour reprendre interrogation @Médinoc, ta copie d'écran montre que le paramètre "count" passé à la méthode "new" a une valeur de "4052220300" octets, soit environ 4Go.

    Cela peut sembler "normal" pour un nouveau venu dans l'informatique, mais pour un mec comme moi, qui est commencé sur des systèmes 8/16bits où 64Ko de RAM c'était la fin du monde (Bilou et son 1Mo, si tu nous écoutes ), c'est GIGANTESQUE.

    Déjà, si votre programme est en 32bits, ce type d'allocation, c'est mort.
    Sur une machine 64bits, si ça passe, votre machine sera sur les genoux (à moins d'avoir un supercalculateur MODERNE comme joujou).

    Donc, remontez la pile d'appel grâce au débogueur (vous n'avez qu'à cliquer dans la fenêtre "Call Stack" sur la ligne qui correspond à la méthode que vous voulez analyser pour qu'elle s'affiche).
    La fonction qui appel une autre fonction est dans la ligne juste sous la ligne correspond à la fonction appelée. (C'est une pile quoi).

Discussions similaires

  1. Allocation dynamique dans une fonction
    Par Kaluza dans le forum Langage
    Réponses: 8
    Dernier message: 26/04/2011, 10h23
  2. allocation dynamique dans une structure !
    Par grodashe dans le forum C
    Réponses: 2
    Dernier message: 31/12/2009, 11h17
  3. Allocation dynamique dans une fonction
    Par n0mad dans le forum Débuter
    Réponses: 5
    Dernier message: 05/02/2009, 22h42
  4. Allocation dynamique dans subroutine d'un argument
    Par kranck dans le forum Fortran
    Réponses: 13
    Dernier message: 22/09/2008, 17h01
  5. [D7] - Allocation dynamique dans une DLL
    Par david_chardonnet dans le forum Delphi
    Réponses: 6
    Dernier message: 05/07/2006, 15h28

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