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 :

programme fonctionne en debug mais pas en release ?


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut programme fonctionne en debug mais pas en release ?
    Bonjour tous,

    j'ai un soucis bizarre sur mon programme :

    => il fonctionne en debug (il effectue les 12 iterations qu'il doit effectuer) mais en mode release il ne fonctionne pas : il beug completement (il se ferme) à la 5eme iteration...

    auriez vous une idée d'où cela peut venir ??

    je suis carrement pommé sur ce coup...

  2. #2
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    En général, c'est que le programme est mal formé mais que le compilateur ne s'en rend pas compte. Du coup, une optimisation exécutée en mode release fait tout exploser.

    Y a-t-il un warning à la compilation ? Purrait-on avoir le code de cette boucle ?
    Sans plus d'informations, il nous sera dur de t'aider, en tout cas.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci de ton aide. Pour le code : oui, voici :

    Main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main(int argc, char *argv[])
    {
    Input input;
    Coupl coup;
    nb=5;
    for (unsigned int i=0;i<12;i++)
    {
    vector<string> temp; temp.clear();
    temp=coup.get_temp(i,nb);
    input.runInput(nb,temp,coup,i);
    }
    input.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef InputH //to avoid interference between fonctions
    #define InputH
    #include <string>
    #include <vector>
    #include "Coup.h"
    class Input
    {
        public:
            Input();
            ~Input();        void runInput(int,std::vector<std::string>,Coup&,unsigned int);
        private:
    };
    #endif // InputH included
    Coup.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #ifndef COUPL_HPP_INCLUDED
    #define COUPL_HPP_INCLUDED
    #include <string>
    #include <vector>
    class Coup
    {
        public:
            Coup();
            ~Coup();
            std::vector < std::string > get_temp(unsigned int,int);
        private:
    };
    #endif // COUP_HPP_INCLUDED
    Coup.cpp
    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
     
    #include <iostream>
    #include <string>
    #include <vector> 
    #include <fstream> 
    #include <stdlib.h>
    #include <sstream> 
    #include "Coup.h"
    using namespace std;
    Coup::Coup()
    {
    }
    Coup::~Coup()
    {
    }
    vector <string> Coup::get_temp(unsigned int _g,int Nb)
    {
        vector <string> temp; temp.clear();
        for (int j=0;j<Nb;j++)
        {
            temp.push_back( Tim[j] );
            temp.push_back( Tem[j][_g] );
        }
    return temp;
    Input.cpp
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    #include <iostream>   
    #include <fstream>       
    #include <sstream>  
    #include <vector>     
    #include <stdlib.h>
    #include "Input.h"
    #include "Coup.h"
    #include "Mat.h"
    #include "Elem.h"
    #include "Start.h"
    #include "Preci.h"
    #include "main.h"
    using namespace std;
    Input::Input()
    {
    }
    Input::~Input()
    {
    }
    void Input::runInput(int coupling,vector<string> temp,Coup &_coup,unsigned int nb)
    {
        vector<string> arg;              
        vector< vector<string> >argBis;   
        int a=0;
        bool testTemp=false,TestDistri=false;
        string command, dump;
        Mat _mat;
        Elem _elem;
        Preci _preci;
        Start start;
        string my_file = "texte.txt";
        ifstream dataBase(my_file.c_str(), ios::in);    
        if(dataBase)   
        {
            while (!dataBase.eof())   
            {
                getline(dataBase,dump);              
                arg.clear();
                parse(dump,arg);
                if (arg[0]=="#")
                {
                }
                else if (arg[0]=="mat")
                {
                    a=0;
                    a=arg.size()-1; 
                    if (a==4)
                    {
                    }
                    else if (a<4)
                    {                    
                        break;
                    }
                    else if (a>4)
                    {
                        break;
                    }
                    _mat.Add_Mat(arg);
                }
                else if (arg[0]=="elem")
                {
                    a=0;
                    a=arg.size()-1;
                    if (a==5)
                    {
                    }
                    else if (a<5)
                    {
                       break;
                    }
                    else if (a>5)
                    {
                        break;
                    }
                    _elem.Add_Elem(arg);
                }
                else if (arg[0]=="preci")
                {
                        _preci.Add_Preci(arg,_elem);
                }
                else if (arg[0]=="tempProfile")
                {
                    if (TestTemp==true)
                    {
                        break;
                    }
                    else if(coupling==1)
                    {
                        argBis.push_back(temp);
                    }
                    else
                    {
                        a=0;
                        a=arg.size()-1;
                        if (a%2!=0)    
                        {
                          break;
                        }
                        else
                        {
                        }
                        for (size_t i=1; i<arg.size()-3; i=i+2) 
                        {                       
                            if ( atof(arg[i+2].c_str()) >= atof(arg[i].c_str()) )
                            {
                            }
                            else
                            {
                                break;
                            }
                        }
                        argBis.push_back( arg );
                    }
                }
                else if (arg[0]=="all")
                {
                    _elem.Add_All(arg);
                }
            }
            TempProfile _tempProfile(argBis.back());
            dataBase.close(); 
            tempeFileBase.close();
            _initialBase.close();
    start.Run(coupling,_coup,nb,_mat,_preci,_elem,_tempProfile,TestTemp,TestDistri);
        }
    }
    Start.h
    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
     
    #ifndef StartH
    #define StartH
    #include <vector>
    #include <string>
    #include "Elem.h"
    #include "Mat.h"
    #include "Preci.h"
    #include "Temp.h"
    #include "Coup.h"
    class Start
    {
        public:
                Start();
                ~Start();
                void Run(int,Coup&,unsigned int,Mat&,Preci&,Elem&,Temp&,bool,bool);
        private:
     
    };
    //-------------------------------------------------------------------------------
    #endif // StartH INCLUDED
    Start.cpp
    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
     
    #include <iostream>  
    #include <fstream>    
    #include <sstream>   
    #include <vector>  
    #include "Start.h"
    #include "Cal.h"
    #include "main.h"
    #include <math.h> 
    using namespace std;
    Start::Start()
    {
    }
    Start::~Start()
    {
    }
    void Start::Run(int r,Coup &_coup,unsigned int Nb,Mat &mat,Preci &preci,Elem &elem,Temp &temp,bool dat, bool initial)
    {
    //"ici je suis presque certain qu'il n'y a pas d'erreur"
    }

    je n'ai mis que les bout de code que j'ai changé il n'y a pas trop longtemps. Le reste date de très vieux et il n'y a pas de soucis à priori.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ce type de problème peut venir de variables primitives non initialisées. En mode debug, elles sont intialisées avec une valeur par defaut, mais en mode release, non.

    Mets ton warning au niveau maximal.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup de prendre le temps de m'aider !

    J'ai deux petites questions :
    1°) qu'appel tu des variables primitives ?
    2°) comment dire à mon IDE de sortir le plus de warning possible ?
    (je suis sous Qt ou sous CodeBlock)

    Voici les warning que j'ai :
    1°) j'ai pas mal de variables inutilisées (normal car j'ai commenté du code que je n'utilise pas encore)
    2°) j'ai pas mal de "multiline comment"
    3°) j'ai aussi une fonction non void qui ne renvoi rien (en fait elle renvoi quelque chose car je l'a fait passer dans un "if" et si elle passe dans le if c'est +1 et si elle passe dans le else c'est -1.
    4°) j'ai des warning du genre : comparaison between unsigned integer and integer (mais je ne pense pas que ça soit bien grave car lorsque j'ai ceci mais entier sont positifs)

    Autres pistes :
    en fait je n'ai pas beaucoup de warning et en plus ceux que j'ai sont à des endroits où je n'ai pratiquement jamais de soucis...

    en fait je me demande si je n'ai pas un de ces soucis :

    1°) j'ai inclue les headers ".h" c'importe comment et du coup il s'appel entre eux et ça fou le bordel ?

    2°) ou je me demande si je ne dois pas initialiser mes objets où les détruire à la fin de chaque boucle...
    je dis ceci car avant j'utilisé exactement le même programme mais sans boucle et tous marchait bien... maintenant que j'utilise une boucle ça plante...
    du coup je me dis que lors d'une nouvelle itération les précédentes informations n'ont pas étés correctement effacées ?

  6. #6
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    [...]
    Voici les warning que j'ai :
    1°) j'ai pas mal de variables inutilisées (normal car j'ai commenté du code que je n'utilise pas encore)
    2°) j'ai pas mal de "multiline comment"
    Qu'est-ce que ce warning ? Serait-il possible d'avoir les termes exacts ? (jamais rencontré, celui-ci)

    3°) j'ai aussi une fonction non void qui ne renvoi rien (en fait elle renvoi quelque chose car je l'a fait passer dans un "if" et si elle passe dans le if c'est +1 et si elle passe dans le else c'est -1.
    En théorie, le compilateur est capable de se rendre compte de cet état de fait. Es-tu certain que tu renvoies bien quelque chose ? Un cas d'école de ce genre de bug dont on se croit protégé est quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int foo(int p) {
       if (p > 0) { // Si p est positif
          // 150 lignes de code pour oublier la comparaison ci-dessus
          return 1;
       }
       if (p < 0) { // Sinon, si p est négatif
          // 150 autres lignes de code
          return 0;
       }
    }
     
    // Et foo(0) ?
    4°) j'ai des warning du genre : comparaison between unsigned integer and integer (mais je ne pense pas que ça soit bien grave car lorsque j'ai ceci mais entier sont positifs
    Ce genre de warning annonce souvent des failles de sécurité. Si tu es certain que tes entiers sont positifs, pourquoi ne pas les mettre unsigned int ?

    Autres pistes :
    en fait je n'ai pas beaucoup de warning et en plus ceux que j'ai sont à des endroits où je n'ai pratiquement jamais de soucis...

    en fait je me demande si je n'ai pas un de ces soucis :

    1°) j'ai inclue les headers ".h" c'importe comment et du coup il s'appel entre eux et ça fou le bordel ?
    Un problème de header se poserait à la compilation, pas à l'exécution. (même avec un compilateur du siècle dernier, je pense)

    2°) ou je me demande si je ne dois pas initialiser mes objets où les détruire à la fin de chaque boucle...
    je dis ceci car avant j'utilisé exactement le même programme mais sans boucle et tous marchait bien... maintenant que j'utilise une boucle ça plante...
    du coup je me dis que lors d'une nouvelle itération les précédentes informations n'ont pas étés correctement effacées ?
    De quelle boucle parles-tu ? (Dans 200 lignes de code, difficile de deviner laquelle.)

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    1°) qu'appel tu des variables primitives ?
    int, double, etc. Par opposition à des instances de classe.

    Citation Envoyé par 21did21 Voir le message
    2°) comment dire à mon IDE de sortir le plus de warning possible ?
    (je suis sous Qt ou sous CodeBlock)
    Je ne connais pas ces environnements.

    Citation Envoyé par 21did21 Voir le message
    2°) j'ai pas mal de "multiline comment"
    Je ne vois pas en quoi ça pose un problème au compilateur...

    Citation Envoyé par 21did21 Voir le message
    3°) j'ai aussi une fonction non void qui ne renvoi rien (en fait elle renvoi quelque chose car je l'a fait passer dans un "if" et si elle passe dans le if c'est +1 et si elle passe dans le else c'est -1.
    Fais malgré tout un return. Ca ne mange pas de pain. Mets éventuellement un assert(false) juste avant si tu es sûr que tu n'es jamais supposé passer par là.

    Citation Envoyé par 21did21 Voir le message
    4°) j'ai des warning du genre : comparaison between unsigned integer and integer (mais je ne pense pas que ça soit bien grave car lorsque j'ai ceci mais entier sont positifs)
    Si, ça peut être grave si ta valeur dépasse 32567.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup pour ces réponses !
    je vais essayé de modifier ceci déjà.


    de toute façon je suis persuadé que mon probleme ne vient pas de ces warning car je l'ai ai depuis très longtemps et ça à toujours fonctionné et là je n'ai pas touché à cette partie de code.

    en fait je pense vraiment que c'est dans l'initilisation de mes objets où dans les includes...
    pourrais tu me montrer toi comment tu ferais sur un petit exemple simple pour déclarer un objet dans une boucle et effacer le contenu à la fin de la boucle ?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    pourrais tu me montrer toi comment tu ferais sur un petit exemple simple pour déclarer un objet dans une boucle et effacer le contenu à la fin de la boucle ?
    Question trop vague.

  10. #10
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Qui peut être répondue par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int i = 0 ; i < 42 ; ++i) {
       int k = 0; // k est réinitialisé et égal à 0 à chaque tour de boucle
    }
    La question est plutôt : Que penses-tu que le problème soit, avec cette boucle ? Pourquoi ne pas nous sortir le code de cette fameuse boucle du reste de ton code ? (Histoire qu'on sache de laquelle tu parles.)

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    1°) je vais corriger tous les petits beug que vous m'avez signalé.

    2°) quand je parle de problèmes dans la boucle je parle de la boucle principale de mon main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (unsigned int i=0;i<12;i++)
    {
    vector<string> temp; temp.clear();
    temp=coup.get_temp(i,nb);
    input.runInput(nb,temp,coup,i);
    }
    j'appel cette méthode "runInput" qui fait plein de calcul à partir des objets qui sont déclaré dans cette même méthode : "mat" "elem" "preci".

    3°) le soucis c'est que le n-ième calcul (la n-ième fois que j'appel cette méthode : runInput ) doit être indépendant du premier appel à "runInput" et je ne suis pas certain qu'avec cette implémentation mes calculs soient indépendant...

    ps: si je ne suis pas clair merci de me le signaler

  12. #12
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Ni ton objet coup, ni ton objet input ne sont remis à zéro à chaque tour de boucle, vu qu'ils sont déclarés en dehors.

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    merci beaucoup de prendre le temps de m'aider !

    J'ai deux petites questions :
    1°) qu'appel tu des variables primitives ?
    Les types qui n'ont pas besoin de fichier d'en-tête pour etre compris du compilateur:
    • Les entiers signé (par ordre de taille)char, short, int, long et long long (sur les compilateurs récents)
    • les entiers non signés (par ordre de taille)unsigned char, unsigned short, unsigned int, unsigned long et unsigned long long (sur les compilateurs récents)
    • les réels (par ordre de taille)float, double et long double(sur les compilateurs récents)
    • et bien sur les booléens bool

    2°) comment dire à mon IDE de sortir le plus de warning possible ?
    (je suis sous Qt ou sous CodeBlock)
    avec CodeBlocks:

    • chosir le menu "Options->Compiler"
    • dans la fenetre qui s'ouvre, choisir l'onglet "compiler settigns" puis le sous onglet "compiler flags"
    • Éventuellement choisir "Warning" dans la liste déroulante
    • cocher "Enable all compiler warnings (-Wall)
    • cocher "Enable warnings demanded by strict ISO (-pedentic)
    • cocher "Enable Effective C++ warning (-Weffc++)
    Pour QtCreator
    ouvrir le fichier *.pro correspondant à ton projet
    rajouter la ligne
    QMAKE_CXXFLAGS += -Wall -pedentic -Weffc++)
    Voici les warning que j'ai :
    1°) j'ai pas mal de variables inutilisées (normal car j'ai commenté du code que je n'utilise pas encore)
    essaye de commenter aussi les variables qui ne sont utilisées que par le code commenté...

    Cela te permettra au moins de limiter les avertissements et donc de te permettre de "repérer ceux qui sont vraiment importants
    2°) j'ai pas mal de "multiline comment"
    aucun problème
    3°) j'ai aussi une fonction non void qui ne renvoi rien (en fait elle renvoi quelque chose car je l'a fait passer dans un "if" et si elle passe dans le if c'est +1 et si elle passe dans le else c'est -1.
    Etant donné que l'instruction return a pour effet la sortie de la fonction, tu peux très bien envisager d'écrire ton code sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int  foo()
    {
        if(condition)
        {
            /* ce qu'il faut faire */
            return  1;
        }
        // on ne passe ici que si la condition était fausse
        /* ce qu'il faut faire */
        return  -1
    }
    4°) j'ai des warning du genre : comparaison between unsigned integer and integer (mais je ne pense pas que ça soit bien grave car lorsque j'ai ceci mais entier sont positifs)
    C'est surtout le signe que tu risque d'avoir des affichages surprenants si tu utilises un entier signé là ou tu devrait utiliser un entier non signé.

    C'est, souvent (mais pas uniquement) du à l'utilisation de la fonction size() des collections de la STL, qui renvoient un size_t (qui correspond à un unsigned int, unsigned long ou unsigned long long selon les systèmes), car la taille d'un tableau ne peut pas etre négative
    Autres pistes :
    en fait je n'ai pas beaucoup de warning et en plus ceux que j'ai sont à des endroits où je n'ai pratiquement jamais de soucis...
    L'idéal est quand meme de résoudre tous les avertissements car ils sont le symptome du fait que quelque chose "risque de clocher" (de préférence le jour de la présentation officielle du programme )
    1°) j'ai inclue les headers ".h" c'importe comment et du coup il s'appel entre eux et ça fou le bordel ?
    A priori, non, si du moins, tu as bien mis les garde anti inclusion
    2°) ou je me demande si je ne dois pas initialiser mes objets où les détruire à la fin de chaque boucle...
    Déclare les variables dans la portée dans laquelle elles sont utilisées

    Si tu as un objet qui doit impérativement etre initialisé dans une boucle, déclare le entre l'accolade ouvrante et l'accolade fermante de la boucle

    je dis ceci car avant j'utilisé exactement le même programme mais sans boucle et tous marchait bien... maintenant que j'utilise une boucle ça plante...
    Fait attention au fait que ca peut planter parfois très loin de la source du problème...

    Il suffit parfois d'une incrémentation de pointeur là ou il aurait fallut incrémenter ce qui est pointé par le pointeur pour que "ca plante" cinq fonctions plus loin
    du coup je me dis que lors d'une nouvelle itération les précédentes informations n'ont pas étés correctement effacées ?
    Si ton objet n'est pas déclaré dans la boucle, c'est normal
    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

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Merci beaucoup tous pour votre aide ! et pour ces réponses super précises

    je n'ai pas eu le temps encore de m'occuper de corriger tous mes warning (pas mal occupé ses jours ci) mais je vais le faire d'ici peu et je vvous tiendrez informé.

    Citation Envoyé par Ekleog Voir le message
    Ni ton objet coup, ni ton objet input ne sont remis à zéro à chaque tour de boucle, vu qu'ils sont déclarés en dehors.
    j'ai vraiment cru que ça venait d'ici le problème mais je viens de déclarer input dans la boucle et ça n'a rien changé... dommage. (Coup doit avoir une portée général donc je l'ai laissé à l'extérieur de la boucle).

    au fait, tout au départ de fichier input je déclare des objets "Mat" "Elem" "Preci" ... ces objets sont effacé à chaque fois que INPUT est initialisé puisqu'ils sont déclaré à l'intérieur d'une méthode de la classe input ? (c'est à dire à chaque passage dans la boucle ?)


    - merci Koala pour ta réponse super précise, je suivrai tes conseils.
    => par contre juste une question à propos de ton message :
    Citation Envoyé par koala01 Voir le message
    A priori, non, si du moins, tu as bien mis les garde anti inclusion
    je ne suis pas trop sur de moins peux tu me dire si c'est bien le cas dans mon code stp ?

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    salut tous !

    j'ai tous corrigé et j'ai changé mes options de compilateur et voici les deux problèmes qui sont affichés à présent dans mes warning :

    1°) j'ai pas mal de warning dans ce genre :

    'Preci::AAA' should be initialized in the member initialization list

    2°) et aussi :

    ISO C++ does not support the '%lf' ms.printf format

    2°) -> pour le 2eme warning je pense que ce n'est pas tres grave... en fait j'utilise parfois les mots clef du C pour écrire dans les fichiers textes.
    ce n'est pas grave ?

    1°) pour le premier ça vient du fait que je n'ai initialisé dans mon construteur mes variables ? je dois le faire que pour les varaibles primaires ou aussi pour les vecteurs, objet ... ?

  16. #16
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    au fait, tout au départ de fichier input je déclare des objets "Mat" "Elem" "Preci" ...
    C'est-à-dire ? En variables globales ?
    Si oui, c'est très probablement pour cette raison que ton état ne s' "efface" pas d'un tour de boucle à l'autre.

    1°) j'ai pas mal de warning dans ce genre :

    'Preci::AAA' should be initialized in the member initialization list
    Tu as un constructeur qui ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Preci {
       int AAA, BBB;
    public:
       Preci() : BBB(42) {}
    };
    Et qui devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Preci {
       int AAA, BBB;
    public:
       Preci() : AAA(0), BBB(42) {}
    };
    (Je ne peux pas être certain du code précis, mais il me semble que c'est ce genre de bug qui conduit à ce warning.)
    Par ailleurs, AAA n'est pas un nom très explicite -- l'as-tu remplacé pour nous, ou s'appelle-t-il comme ça dans ton code ? Si oui, il faudrait changer ce nom : la moitié des bugs softwares est dû à la mauvaise compréhension d'un nom de variable. (Non, je n'ai pas de source.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    2°) et aussi :
     
    ISO C++ does not support the '%lf' ms.printf format
    Qu'est-ce que ms.printf ?
    Par ailleurs, %lf (long float ?) devrait être remplacé par %f, je crois. (Je n'ai plus l'habitude des format à la C.)

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    merci beaucoup de prendre el temps de m'aider


    Citation Envoyé par Ekleog Voir le message
    C'est-à-dire ? En variables globales ?
    Si oui, c'est très probablement pour cette raison que ton état ne s' "efface" pas d'un tour de boucle à l'autre.
    non j'ai quelque chose dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    myMethode
    {
    Class1 objet1;
    }
    => je déclare un objet à l'intérieur d'une méthode d'une autre classe.

    du coup je voudrais être certain que lors cette méthode est arrivée jusqu'au bout j'ai bien mon objet qui est détruit.. es ce bien le cas ?

    Citation Envoyé par Ekleog Voir le message
    Tu as un constructeur qui ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Preci {
       int AAA, BBB;
    public:
       Preci() : BBB(42) {}
    };
    Et qui devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Preci {
       int AAA, BBB;
    public:
       Preci() : AAA(0), BBB(42) {}
    };
    (Je ne peux pas être certain du code précis, mais il me semble que c'est ce genre de bug qui conduit à ce warning.)
    => OK! super !!! (c'etais ceci, en fait moi j'utilisais une autre méthode pour initialiser dans le constructeur...)

    Citation Envoyé par Ekleog Voir le message
    Par ailleurs, AAA n'est pas un nom très explicite -- l'as-tu remplacé pour nous, ou s'appelle-t-il comme ça dans ton code ? Si oui, il faudrait changer ce nom : la moitié des bugs softwares est dû à la mauvaise compréhension d'un nom de variable. (Non, je n'ai pas de source.)
    => oui, je l'ai remplacé pour vous en fait

    Citation Envoyé par Ekleog Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    2°) et aussi :
    ISO C++ does not support the '%lf' ms.printf format
    Qu'est-ce que ms.printf ?
    en fait c'est "ms_printf" je ne sais pas ce que c'est... c'est mon compilateur qui me renvoi ce warning...

    Citation Envoyé par Ekleog Voir le message
    Par ailleurs, %lf (long float ?) devrait être remplacé par %f, je crois. (Je n'ai plus l'habitude des format à la C.)
    oups, je ne sais plus...
    ça fait longtemps que j'avais écrit ceci et du coup je ne m'en rappel plus...

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Ekleog Voir le message
    Qu'est-ce que ms.printf ?
    Par ailleurs, %lf (long float ?) devrait être remplacé par %f, je crois. (Je n'ai plus l'habitude des format à la C.)
    C'est aussi bête que cruel

    %lf est un format pour printf made by microsoft (ms dans le texte ), qui fait partie d'une extension ou l'autre fournie par la dite firme, et qui n'a strictement rien de standard
    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

  19. #19
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    [...]
    du coup je voudrais être certain que lors cette méthode est arrivée jusqu'au bout j'ai bien mon objet qui est détruit.. es ce bien le cas ?
    [...]
    Oui, un objet déclaré tel que tu l'annonces ici est bien détruit à la sortie de la fonction. Attention, par contre, aux pointeurs.

    Pourrais-tu fournir un exemple compilable et exécutable minimal illustrant ton problème ?

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    mon code est un peu gros donc je fais un petit tri et je te l'envoi par MP ?

    je viens de faire toutes les modifications que vous m'avez dit, et maintenant voici ce qui se passe :

    1°) mon programme beug maintenant autant en debut qu'en mode release
    => en fait ça doit venir du fait que j'ai modifié les options du compilateur.

    2°) du coup, j'ai testé un autre truc :

    => j'ai pris tous mes fichiers sources dans un autre dossier et j'ai compilé mon programme.

    et là : surprise !!!! = mon code marche parfaitement

    je ne comprends plus rien comment ça se fait que mon code fonctionne dans un dossier mais pas dans un autre ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/02/2015, 15h18
  2. Réponses: 5
    Dernier message: 20/09/2014, 07h36
  3. Fonctionne en Debug mais pas en Release
    Par Baud10 dans le forum MFC
    Réponses: 23
    Dernier message: 04/02/2008, 15h17
  4. regsvr32 failed en debug mais pas en release
    Par afan dans le forum DirectX
    Réponses: 1
    Dernier message: 09/06/2004, 10h32
  5. Programme fonctionnant sur Eclipse mais pas avec le jar?
    Par kirik dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 10/02/2004, 13h43

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