Bonjour,

Je suis débutant en c++ et j'ai un problème avec une classe qui calcul un checksum...
Il n'y a pas de souci lorsque l'appel la méthode de calcul du checksum qu'une seule fois mais lorsque que je l'appel un certains nombre de fois, ça bug à un moment donné.
J'ai ce message en console : process returned -1073741819 (0xc0000005).
Et une erreur windows lié à ntdll.dll.:euh:
Le problème c'est que si je lance en debug, ça ne plante jamais.. , j'ai vu qu'il y avait peut être une surallocation de la mémoire pour le mode debug.

Voici mon code :

le .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
22
23
24
25
26
27
28
29
30
31
 
#ifndef CHECKSUM_H
#define CHECKSUM_H
 
#include <string>
#include <cstring>
#include <iostream>
#include <sstream>
#include <vector>
#include <math.h>
 
 
 
class Checksum
{
    public:
        Checksum();
        Checksum(std::string strChaineRecue);
        virtual ~Checksum();
 
        bool calcChecksum();
 
    protected:
    private:
        std::string chaine;
        std::string checksum;
 
        std::vector<std::string> cutString(std::string trame, int n);
};
 
#endif // CHECKSUM_H
le 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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
 
#include "Checksum.h"
 
using namespace std;
 
/*------------------------------------------------------------------------
*                 CONSTRUCTEURS ET DESTRUCTEUR DE LA CLASSE
* Parametres :
* string chaineRecue
*
* Exemple :
* Checksum sum("55AA70010071");
* bool isGood = sum.calcChecksum();
*------------------------------------------------------------------------	*/
 
Checksum::Checksum(string strChaineRecue)
{
    chaine = "";
    chaine.assign(strChaineRecue);
    cout << "Dans checksum --> " + chaine << endl; //DEBUG
    //MessageBox(NULL,"BONJOUR","CHECKSUM",MB_OK|MB_ICONEXCLAMATION); //DEBUG
}
 
Checksum::Checksum()
{
    chaine = "";
    checksum = "";
}
 
Checksum::~Checksum()
{
    //MessageBox(NULL,"AU REVOIR","CHECKSUM",MB_OK|MB_ICONEXCLAMATION); //DEBUG
    cout << "Quit checksum " << endl;
}
 
/*------------------------------------------------------------------------
*                 Méthode de calcul du checksum
*
* Parametres :
*
* Retour : un boolean egal à 0 si erreur.
*------------------------------------------------------------------------	*/
bool Checksum::calcChecksum()
{
    int i = 0;
    int nbEssai = 0; //Nombre de boucles max pour calculer le checksum
    int tmpHex = 0;//
    int sumHex = 0; //Somme en hexa
    int verifSum = 0; //Checksum a vérifier (dernier octet)
    int lastOctet = 0; // Dernier octet envoyé (Checksum)
    bool endCalc = false; //Booléen indiquenat le fin du calcul
    int tailleVector = 0;
    ostringstream oss; //Flux de sortie
    string result = "";
    vector<string> vChaineToCalc; //Chaine à calculer le checksum
 
    vChaineToCalc.clear();
    // réserver (allouer) de la place pour au moins n éléments
    vChaineToCalc.reserve(50);
 
    //Vérification que la chaine est un nombre pair : Si result = 721 alors on met result = 0721 (Pour le calcul de la somme des octets)
    if((chaine.size() % 2) == 0){
        // nb pair, on ne fait rien
    }else{
         // nb impair, on ajoute un 0 au début
         chaine = "0" + chaine;
    }
 
    //Découpe la chaine par paire de lettre :
    vChaineToCalc = cutString(chaine, 2);
    /*---------------------------------------------------------------------*/
    // On recherche le checkum dans la trame (dernier octet)
    /*---------------------------------------------------------------------*/
    tailleVector = vChaineToCalc.size(); //Taille de la trame
    if(tailleVector>0){
        lastOctet = tailleVector - 1; //Indice du dernier octet (Checksum)
    }else{
        lastOctet = tailleVector; //Indice du dernier octet (Checksum)
    }
 
    /*---------------------------------------------------------------------*/
    // Conversion string -> hexa de l'octet du checksum
    /*---------------------------------------------------------------------*/
    cout << lastOctet << endl;
    cout << vChaineToCalc[lastOctet] << endl;
 
    stringstream iss(vChaineToCalc[lastOctet]);
    iss >> hex >> verifSum;
    iss.clear(); //Vide le buffer
 
    /*---------------------------------------------------------------------*/
 
    //cout << "verifsum : "; //DEBUG
    //cout << verifSum << endl; //DEBUG
 
    /*---------------------------------------------------------------------*/
    // Conversion string -> hexa + calcul de la somme des octets sans l'octet du checksum
    /*---------------------------------------------------------------------*/
 
    for(i=0; i < tailleVector - 1; i++)
    {
        stringstream iss(vChaineToCalc[i]);
        iss >> hex >> tmpHex;
        sumHex += tmpHex;
        iss.clear(); //Vide le buffer
    }
 
    /*---------------------------------------------------------------------*/
 
    //cout << "sumhex : "; //DEBUG
    //cout << sumHex << endl; //DEBUG
 
    while(endCalc == false)
    {
        //Si le nombre est sur plus de 1 octet (FF) on recalcul la somme des octets restant
        if(sumHex > 255)
        {
            // On incrémente le nombre d'essai
            nbEssai++;
            if(nbEssai>5)
            {
                return 0; //ERREUR
            }
 
            // écrire un nombre dans le flux
            oss << hex << sumHex;
            result = oss.str();
            oss.clear(); // Vide le buffer
 
            //Vérification que le résulat est un nombre pair : Si result = 721 alors on met result = 0721 (Pour le calcul de la somme des octets)
            if ((result.length() % 2) == 0){
                // nb pair, on ne fait rien
            } else {
                 // nb impair, on ajoute un 0 au début
                 result = "0" + result;
            }
            //vChaineToCalc.clear();
            vChaineToCalc = cutString(result, 2);
            //On réinitialise sumHex :
            sumHex = 0;
 
            /*---------------------------------------------------------------------*/
            // Conversion string -> hexa + calcul de la somme des octets
            /*---------------------------------------------------------------------*/
            tailleVector = vChaineToCalc.size();
            for(i=0; i < tailleVector; i++)
            {
                stringstream iss(vChaineToCalc[i]);
                iss >> hex >> tmpHex;
                sumHex += tmpHex;
                iss.clear(); //Vide le buffer
            }
 
        }
        else
        {
            endCalc = true;
        }
    }
 
    cout << sumHex << endl;
    cout << verifSum << endl;
    cout.clear();
 
    //Vérification si la somme est bien égal au checksum envoyé :
    if(sumHex == verifSum && sumHex != 0)
    {
        return (1); //CHEKSUM VALIDE
    }
    else
    {
        return (0); //CHEKSUM INVALIDE
    }
}
 
/*------------------------------------------------------------------------
*                 Méthode de découpage d'une chaine de caractères
*
* Parametres
* int n 		    : Intervalle entre les découpages
*
* Retour : un vecteur de string avec la trame où il faut calculer le checksum
*------------------------------------------------------------------------	*/
vector<string> Checksum::cutString(string trame, int n)
{
    unsigned int k;
    vector<string> vectChaine;
 
    //Vérification si la taille de la trame est paire :
    if((trame.size() % 2) == 0)
    {
        for(k=0; k < trame.size() - 1; k+=n)
        {
            cout << "cutString --> 0x" + trame.substr(k, n) << endl; //DEBUG
            vectChaine.push_back("0x" + trame.substr(k, n));
        }
    }
 
    return vectChaine;
}
le code qui appel la classe :

...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Checksum sum(chaine);
isGood = sum.calcChecksum();
...