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

MFC Discussion :

[MFC][VC++6]Libération de mémoire


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut [MFC][VC++6]Libération de mémoire
    Bonjour,

    Je commence à perdre patience devant mes problèmes d'allocation/libération mémoire ... j'ai lu pas mal de docs et tutoriaux sur le sujet mais j'arrive pas à le résoudre ..

    contexte: DLL appelée par une session APL

    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ulint* totpds; //unsigned long int
    Allocation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    totpds = new ulint[NBMAXSAUTS];  //NBMAXSAUTS=90
    Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	for(int i=0;i<NBMAXSAUTS;i++)
    	{
    		totpds[i] = 0;
    	}
    Affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    totpds[tabnumsaut[i]] = totpds[tabnumsaut[i]] + vpdsacc[i];
    tabnumaut[] contient des valeurs < 90
    vpdsacc[] contient des valeurs de types unsigned short int

    Libération
    plantage violent au moment de l'exécution de la ligne ci-dessus ...
    du type (je cite):
    "Microsoft Visual C++ Debug Library
    Debug Error!
    etc etc..."

    Je nage, donc toute aide sera la bienvenue

    merkiiiiiiiiiiii

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Est-ce que le plantage pourrait être un effet de bord d'un problème ne concernant pas cette fameuse variable ?

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Tu nous as coupé la partie intéressante de la debug error.
    On pourrait avoir tout le message ? (y compris ce qui est affiché dans le Output du debugger ?)


    Enfin... Je pense que l'erreur est un truc du genre "guard bytes modified", ce qui indique un débordement de tableau : Tu aurais écris à un index strictement inférieur à zéro ou supérieur/égal à NBMAXSAUTS...
    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.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Citation Envoyé par Médinoc
    Tu nous as coupé la partie intéressante de la debug error.
    On pourrait avoir tout le message ? (y compris ce qui est affiché dans le Output du debugger ?)


    Enfin... Je pense que l'erreur est un truc du genre "guard bytes modified", ce qui indique un débordement de tableau : Tu aurais écris à un index strictement inférieur à zéro ou supérieur/égal à NBMAXSAUTS...
    Je te filerais le message complet demain si ça peut t'aider.

    Pour l'écriture hors bornes, je ne crois pas mais bon, je vérifierais ça aussi

    Je me suis pourtant bien assuré que les indices des boucles dans lesquelles mon tableau est affecté sont inférieurs à NBMAXSAUTS

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Message d'erreur complet:
    Debug Assertion Failed!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Program: D:\aplwin40\aplw.exe
    File: dbgheap.c
    Line: 1011
     
    Expression: _CrtIsValidHeapPointer(pUserData)
     
    For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
     
    (Press Retry to debug the application)

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    OK, ça, ça ressemble plus à une libération de pointeur invalide ou déjà libéré.
    • Vérifie si tu ne modifie pas le pointeur dans ta fonction
    • Vérifie si tu n'as pas mis ton delete[] dans une boucle où il ne devrait pas être
    • Vérifie aussi que tu n'as pas déclaré deux fois le pointeur dans la même fonction, on peut avoir des conneries avec ça...
    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.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Citation Envoyé par Médinoc
    OK, ça, ça ressemble plus à une libération de pointeur invalide ou déjà libéré.
    Vérifie si tu ne modifie pas le pointeur dans ta fonction
    En plus d'une sortie vers un fichier log et d'un test sur la valeur de totpds[i] (i<NBMAXSAUTS), ce que j'ai mis dans mon message initial est l'intégralité de l'utilisation du tableau dans ma fonction.
    Citation Envoyé par Médinoc
    Vérifie si tu n'as pas mis ton delete[] dans une boucle où il ne devrait pas être
    Ce n'est pas le cas, tout mes delete[] sont en fin de fonction, juste avant le return final.
    Citation Envoyé par Médinoc
    Vérifie aussi que tu n'as pas déclaré deux fois le pointeur dans la même fonction, on peut avoir des conneries avec ça...
    Une seule déclaration

    Meci de ton aide !

    Le code intégral de la fonction t'aiderait-t-il ?

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Oui, il y a des chances que ça m'aide.
    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.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    J'ai un tableau à 2 dimensions (appelé tabsauts) déclaré dynamiquement qui m'avait déjà posé problème. Est-ce qu'une mauvaise allocation/libération de cette matrice peut provoquer un plantage au moment de la libération mémoire du tableau totpds ?

    Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int (*tabsauts)[NBMAXSAUTS]=new int[MAX_IND][NBMAXSAUTS];
    Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	for(i=0;i<nind;i++)   //nind < MAX_IND
    	{
    		for(int k=0;k<=NBMAXSAUTS;k++)
    		{
    			tabsauts[i][k] = -1;
    		}
    	}
    Affectations
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    				for(int ilim=0;ilim<NBMAXSAUTS;ilim++)
    				{
    					if(tabrupt[i]>=tablim[ilim])
    					{
    						isaut = indsaut[ilim];
    						if(tabsauts[i][isaut] > -1)
    							continue;
    						tabsauts[i][isaut] = tpsabs[ispot];
    					}
    				}
    tabrupt de type float* de taille MAX_IND
    tablim de type double* de taille NBMAXSAUTS
    indsaut de type int* de taille NBMAXSAUTS
    isaut,ispot de type int


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	for(i=0;i<nind;i++)
    	{
    		for(isaut=1;isaut<=NBMAXSAUTS;isaut++)
    		{
    			if(tabsauts[i][isaut]>-1)
    				tabnumsaut[i]=isaut;
    		}
    	}
    juste un test ...

    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
    	for(i=0;i<nind;i++)
    	{
    		if(Vectcib[0][i] <= epsi)
    			continue;
    		if(tabnumsaut[i] <= 1)
    			continue;
    		Vaci = tabsauts[i][tabnumsaut[i]]-tabsauts[i][1];
    
    		Vaci = Vaci / (tabnumsaut[i]-1);
    
    		tabsauts2[i] = Vaci * vpdsacc[i];
    
    		totpds[tabnumsaut[i]] = totpds[tabnumsaut[i]] + vpdsacc[i];
    
    	}
    Libération mémoire
    Je ne sais pas si c'est correct de faire ça. J'avais cru comprendre qu'il fallait plutôt faire un delete sur chaque sous-élément de la matrice (tabsauts[i]) avant de faire un delete de tabsauts...

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Code suspect : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int k=0;k<=NBMAXSAUTS;k++)
    Et un débordement, un...

    Quand au Delete, ici, tu as un vrai tableau à deux dimensions, donc je pense que c'est bon. Mais je ne suis pas expert des tableaux à deux dimensions alloués par new...
    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.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Citation Envoyé par Médinoc
    Code suspect : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int k=0;k<=NBMAXSAUTS;k++)
    Et un débordement, un...

    Quand au Delete, ici, tu as un vrai tableau à deux dimensions, donc je pense que c'est bon. Mais je ne suis pas expert des tableaux à deux dimensions alloués par new...
    ok, corrigé ce "petit" oubli (shame on me)
    mais je plante toujours sur la libération de mon tableau totpds

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Tu as corrigé les deux ?

    Si oui et que ça plante toujours, je ne vois pas comment t'aider...
    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.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    je peux t'envoyer le code complet par MP si tu es ok ?

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Pourquoi par MP ?
    Tu es lié par un secret professionnel ? Poster directement le code complet de la fonction serait plus simple...
    Quelques coups de debugger pourraient être utiles aussi (et/ou quelques assertions pour vérifier que toutes les valeurs traitées sont dans les limites...)

    PS: Je n'ai pas VC++6 sous la main, je suis sous 2005.
    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.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    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
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
     
    double VitAcc(char *fetude, double *vspots, int nbspots, double *vac, char *dcbl, int nbcib)
    {
    	/*
    	vspots: vecteur des spots triés chronologiquement sur date et heure
    		format=nbspots x
    			chaine
    			jour nommé (aammjj)
    			heure=HHMM = 0815
    			grp sur la cible
    			jour de la semaine (1 à 7)
    	nbspot: nombre de spots dans le vecteur
    	poids: vecteur des poids des nind individus
    	nind: nombre d'individus de la cible
    	vac: vecteur resultat en jours (diviser par 1440)
    	*/
     
    	double* tablim; //table des limites de cumul de probabilites marquant le passage d'n niveau de contact à un autre
    	//tables de travail
    	ulint* totpds;
    	int* tabsauts2;
    	int* tabnumsaut;
    	int* indsaut;
    	int (*tabsauts)[NBMAXSAUTS]=new int[MAX_IND][NBMAXSAUTS];
    	float* tabrupt;
    	int minzero, jourzero;
    	int* tpsabs;	//nb de minutes qui separe 1 spot du premier spot
    	float* tapro;
    	int Vaci;
    	int u;
    	int v=0; // indice pour vspots
    	double ret=0;
    	char fname[255];
    	ulint chaine, jour, qh;
    	int *numvh;
    	int h=0;
    	char* temp;
    	char mn_ch[4],hh_ch[2];
    	int mn_int,hh_int;
    	int isaut = 0;
    	int resu = 0;
    	usint k;
    	double epsi = 0.000001;
    	char dfc[MAX_DEFCIBLE+1];	//libellé de la cible
     
    	usint Vectcib[1][MAX_IND]; // appartenance aux cibles
    	ulint Popcib = 0;
    	double *spots;
     
     
    	tabsauts2 = new int[MAX_IND];
    	tabnumsaut = new int[MAX_IND];
    	tabrupt = new float[MAX_IND];
    	tapro = new float[MAX_IND];
    	usint vpdsacc[MAX_IND];
    	tablim = new double[NBMAXSAUTS];
    	totpds = new ulint[NBMAXSAUTS];
    	tpsabs = new int[nbspots];
    	rangs = new usint[nbspots];
    	indsaut = new int[NBMAXSAUTS];
    	spots = new double[nbspots*5];
    	numvh = new int[nbspots];
     
     
    	// initialisations
    	for(int i=0;i<NBMAXSAUTS;i++)
    	{
    		tablim[i] = i + 0.5;
    		indsaut[i] = i + 1;
    		vac[i] = 0;
    		totpds[i] = 0;
    	}
     
    	if((fetude[0]!=0))	//nouvelle etude, on recharge les differents fichiers de donnnees
    	{
    		strcpy(fname,fetude);
    		for(k=0;;) {if(fname[k++]=='.') break;}
    		// lit le nb d'individus et les poids
    		fname[k++]='p';
    		fname[k++]='d';
    		fname[k++]='s';
    		fname[k]=0;
    		fout<<"fichier de poids="<<fname<<endl;
    		ifstream fpds(fname,ios::in|ios::binary);
    		if(!fpds.good())
    			return -1.1;
    		nind=usint((_filelength(fpds.fd()))/2);
    		fpds.seekg(0,ios::beg);
    		fpds.read((char*) vpdsacc,2*nind);
    		fpds.close();
     
    		//lecture des audiences
    		k-=3;
    		fname[k++]='a';
    		fname[k++]='u';
    		fname[k++]='d';
    		fname[k]=0;
    		fout<<"fichier d'audience="<<fname<<endl;
    		pmf=(char*)pointfichaud.Open(fname);
    		if(!pmf)
    			return -1.2;
     
    		//lecture du fichier des variables
    		// ouvre le fichier des variables
    		// meme var que planifier ?
    		//if(a_fvar.is_open())
    		//	a_fvar.close();
    		k-=3;
    		fname[k++]='v';
    		fname[k++]='a';
    		fname[k++]='r';
    		fname[k]=0;
    		fout<<"fichier var="<<fname<<endl;
    		if(a_fvar.is_open()) a_fvar.close();
    		a_fvar.open(fname,ios::in|ios::binary);
    		fout<<a_fvar.good()<<"\n";
    		if(!a_fvar.good())
    			return -1.3;
     
    	}
    	else
    	{
    		fout<<"Aucune etude chargée\n";
    		return -1.4;
    	}
     
    	//initialisations
    	fout<<"nbmaxsauts="<<NBMAXSAUTS<<endl;
    	for(i=0;i<nind;i++)
    	{
    		tabnumsaut[i] = 0;
    		tabsauts2[i] = 0;
    		tabrupt[i] = 0.0;
    		tapro[i] = 0.0;
    		for(int k=0;k<NBMAXSAUTS;k++)
    		{
    			tabsauts[i][k] = -1;
    		}
    	}
     
     
     
     
    	//remplissage du vecteur d'appartenance à la cible
    	k = 0;
    	for(usint p=0;p<nbcib;p++)
    	{
    		for(usint j=0;j<MAX_DEFCIBLE;j++)
    		{
    			dfc[j]=dcbl[k++];
    			if(dfc[j]==';') break;
    		}
    		dfc[j]=0;
    		int nerr=Cible(a_fvar,dfc,Vectcib[p]);
     
    		if(nerr!=0)
    		{
    			return -(10.0+nerr);
    		}
    	}
    	//a_fvar.close();
     
    	//calcul de la somme des poids des interviewés appartenant à la cible
    	for(int n=0;n<nbcib;n++)
    		for(p=0;p<nind;p++)
    			if(Vectcib[n][p]!=0)
    				Popcib+=vpdsacc[p];
     
    	//Verif poids
    	fout<<"Verif Poids\n";
    	for(n=0;n<nind;n++)
    		//if(Vectcib[0][n]==100)
    			fout<<n<<"\t"<<vpdsacc[n]<<"\t"<<Vectcib[0][n]<<endl;
     
     
    	fout<<"Popcib="<<Popcib<<endl;
     
    	nvh=(usint) *((lint*)(pmf+4)); //nombre de vehicules
     
    	//formatage des dates, si AAMMJJ on ajoute 20.000.000, exemple: 060101<=>60101<99999 ->600101+20000000=20060101
    	for(i=0;i<nbspots;i++)
    	{
    		if(vspots[v+1]<99999)
    			vspots[v+1]+=20000000;
    		v+=5;
    	}
     
    	// tri chronologique des spots
    	TriSpots(vspots,nbspots);
     
    	for(int zz=0;zz<nbspots*5;zz++)
    		spots[zz] = vspots[zz];
     
     
    	// calcul du rang de chaque spot de vspots dans le fichier aud
    	for(int r=0;r<nbspots;r++)
    	{
    		chaine = (usint)vspots[h];
    		if(chaine>7)
    		{
    			fout<<"Erreur dans numero de chaine: "<<chaine<<endl;
    			return -1.5;
    		}
    		qh = (ulint)vspots[h+2];
    		jour = (ulint)vspots[h+4];
    		h+=5;
     
    		// numero du premier qh correspondant
    		numvh[r] = 672*(chaine-1)+jour*96-96;
    		//fout<<"numvh["<<r<<"]="<<numvh[r]<<endl;
     
     
    		//recuperer les minutes de l'heure
    		temp = itoa(qh,mn_ch,10);
    		if(qh<1000)
    		{
    			hh_ch[0] = '0';hh_ch[1] = mn_ch[0];
    			mn_ch[0] = '0';
    		}
    		else
    		{
    			hh_ch[0] = mn_ch[0]; hh_ch[1] = mn_ch[1];mn_ch[0] = '0'; mn_ch[1] = '0';
    		}
    		hh_int = atoi(hh_ch);
    		mn_int = atoi(mn_ch);
     
    		if((mn_int/15)<1)
    			qh = 1;
    		else if(((mn_int/15)>=1)&&((mn_int/15)<2))
    			qh = 2;
    		else if(((mn_int/15)>=2)&&((mn_int/15)<3))
    			qh = 3;
    		else if((mn_int/15)>=3)
    			qh = 4;
     
    		qh = (hh_int - 3) * 4 + qh;
     
    		rangs[r] = (usint)qh;
     
    		//calcul du vehicule exact
    		/*if(numvh[r] != 0)
    			numvh[r]--;*/
    		numvh[r] = numvh[r] + qh;
     
    	}
     
    	//on prend pour minute zero l'heure de passage du premier spot
    	//calcul pour chaque spot le nombre de minutes qui le separent de ce premier spot
    	jourzero = (ulint)vspots[1];
    	minzero = (ulint)vspots[2]; // heure de passage du premier spot
    	u=0;	//compteur spots
    	v=0;
    	for(k=0;k<nbspots;k++)
    	{
    		// calcul du nombre de minutes separant chaque spot
    		tpsabs[k] = minutesbetween(jourzero, minzero, (ulint)vspots[v+1], (ulint)vspots[v+2]);
    		fout<<tpsabs[k]<<endl;
    		v+=5;
    	}
     
     
     
    	//pour chaque spot
    	for(int ispot=0;ispot<nbspots;ispot++)
    	{
    		//etablir comme precedemment le vecteur des probabilites tapro(nbint)
    		if(numvh[ispot]>(int)nvh)
    		{
    			fout<<"probleme sur spot "<<ispot<<" vehicule #"<<numvh[ispot]<<" nombre max de vehicule="<<nvh<<endl;
    			return -2;
    		}
    		resu = DistributionContacts(spots, tapro, Vectcib, Popcib, nbspots, nind, vpdsacc, pmf, ispot, numvh);
    		if( resu == 0)
    		{
    			for(i=0;i<nind;i++)
    			{
    				if(Vectcib[0][i] <= epsi)
    					continue;
    				if(tapro[i] <= epsi)
    					continue;
    				tabrupt[i] = tabrupt[i] + tapro[i];
    				for(int ilim=0;ilim<NBMAXSAUTS;ilim++)
    				{
    					if(tabrupt[i]>=tablim[ilim])
    					{
    						isaut = indsaut[ilim];
    						if(tabsauts[i][isaut] > -1)
    							continue;
    						tabsauts[i][isaut] = tpsabs[ispot];
    					}
    				}
    			}
     
    		}
    		else if(resu == 1)
    			fout<<"Grp du spot nul\n";
    		else if(resu == 2)
    			fout<<"Somme nulle\n";
    	}
     
    	for(i=0;i<nind;i++)
    	{
    		if(Vectcib[0][i]==100)
    		{
    			fout<<i<<"\t";
    			for(isaut=0;isaut<NBMAXSAUTS;isaut++)
    				fout<<tabsauts[i][isaut]<<"\t";
    			fout<<endl;
    		}
    	}
     
    	//combien de fois au maximum un interviewé a-t-il été touché ?
    	for(i=0;i<nind;i++)
    	{
    		if(Vectcib[0][i]==100)
    			for(isaut=1;isaut<=NBMAXSAUTS;isaut++)
    			{
    				if(tabsauts[i][isaut]>-1)
    					tabnumsaut[i]=isaut;
    			}
    	}
     
     
     
    	for(i=0;i<nind;i++)
    	{
    		if(Vectcib[0][i] <= epsi)
    			continue;
    		//fout<<((tabsauts[i][tabnumsaut[i]]-tabsauts[i][1])/(tabnumsaut[i]-1))*vpds[i]<<"\n";
    		if(tabnumsaut[i] <= 1)
    			continue;
    		// temps pour etre touché le nombre maxi de fois
    		Vaci = tabsauts[i][tabnumsaut[i]]-tabsauts[i][1];
     
    		// donc touché en moyenne toutes les tpsmoy minutes
    		Vaci = Vaci / (tabnumsaut[i]-1);
     
    		// nb de gens touchés en moyenne toutes les tpsmoy minutes
    		tabsauts2[i] = Vaci * vpdsacc[i];
     
    		// calcul la population touchée n fois
    		totpds[tabnumsaut[i]] = totpds[tabnumsaut[i]] + vpdsacc[i];
     
    		/*fout<<"individu\t"<<i<<"\ttouché en moyenne\t"<<Vaci<<"\tfois\n";
    		fout<<"a chaque temps moyen l'individu\t"<<i<<"\tde poids\t"<<vpds[i]<<"\trepresente une population de\t"<<tabsauts2[i]<<endl;
    		fout<<"population des gens touchés n fois\t"<<totpds[tabnumsaut[i]]<<endl;*/
    	}
     
    	fout<<"totpds\n";
    	for(i=0;i<NBMAXSAUTS;i++)
    		fout<<totpds[i]<<endl;
     
    	// population touchée en moyenne tous les n jours par niveau max de contact
    	for(i=0;i<nind;i++)
    	{
    		//fout<<"tabnumsaut["<<i<<"]=\t"<<tabnumsaut[i]<<endl;
    		//fout<<"tabsauts2["<<i<<"]=\t"<<tabsauts2[i]<<endl;
     
    		if(Vectcib[0][i] <= epsi)
    			continue;
    		if(tabnumsaut[i] >= 0)
    		{
    			vac[tabnumsaut[i]]=vac[tabnumsaut[i]]+tabsauts2[i];
    		}
    	}
     
    	fout<<"VAC\n";
    	for(i=0;i<NBMAXSAUTS;i++)
    		if(Vectcib[0][i]==100)
    			fout<<vac[i]<<endl;
     
    	// part de la population touchée en moyenne tous les n jours a chaque niveau de contact
    	fout<<"VAC / PDS\n";
    		for(isaut=0;isaut<NBMAXSAUTS;isaut++)
    	{
    		if(totpds[isaut] >= epsi)
    			vac[isaut] = (vac[isaut] / totpds[isaut]);// / 1440;
    	}
     
     
    	//ramener les minutes en jours
    	for(isaut=0;isaut<NBMAXSAUTS;isaut++)
    	{
    		vac[isaut] = vac[isaut] / 1440;
    		fout<<isaut<<"\t"<<vac[isaut]<<endl;
    	}
     
    	fout<<"delete tabsauts2\n";
    	delete [] tabsauts2;
    	fout<<"delete tabnumsaut\n";
    	delete [] tabnumsaut;
    	fout<<"delete tabrupt\n";
    	delete [] tabrupt;
    	fout<<"delete tapro\n";
    	delete [] tapro;
    	fout<<"delete tablim\n";
    	delete [] tablim;
    	fout<<"delete totpds\n";
    	delete[] totpds;
    	fout<<"delete indsaut\n";
    	delete [] indsaut;
    	fout<<"delete tpsabs\n";
    	delete [] tpsabs;
    	fout<<"delete spots\n";
    	delete [] spots;
    	fout<<"delete tabsauts\n";
    	delete [] tabsauts;
     
    	fout<<"fin delete\n";
     
    	//Remise an place du contexte pour un appel eventuel de Planifier
    	if(varfile==NULL)
    		nind=0;
     
    	fout<<"FIN TRAITEMENT VITACC\n";
    	return 0;	// si ok
     
    }

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Citation Envoyé par Médinoc
    Pourquoi par MP ?
    Quelques coups de debugger pourraient être utiles aussi (et/ou quelques assertions pour vérifier que toutes les valeurs traitées sont dans les limites...)
    c'est-à-dire ?

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Beurk!
    J'ai essayé de compiler ce code, tu as un nombre incroyable de variables globales non-déclarées, et tu utilises des attributs non-standard de la classe ifstream. (à commencer par fd).

    Les assertions:
    Une assertion sert, en mode debug uniquement, à afficher une erreur si telle condition n'est pas remplie. Cela sert à tester des invariants, ou des conditions qui doivent TOUJOURS être remplies : Parfait donc pour tester les débordements de tableau...

    Sous Visual, une assertion qui échoue donne une boîte de dialogue affichant la ligne, le nom du fichier et l'expression testée : Parfait pour le débogage.

    Code C++ avec assertions : 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
    #include <cassert>
    using namespace std;
     
    //PS: pense à utiliser des pointeurs const là où tu ne fais que des accès en lecture.
    //Et je mettrais aussi les tailles (nbspots, nbcib) en const si elles ne changent pas.
    double VitAcc(char *fetude, double *vspots, int nbspots, double *vac, char *dcbl, int nbcib)
    {
    	//...
    				for(int ilim=0;ilim<NBMAXSAUTS;ilim++)
    				{
    					if(tabrupt[i]>=tablim[ilim])
    					{
    						isaut = indsaut[ilim];
    						assert(isaut >= 0 && isaut < NBMAXSAUTS);
    						assert(ilim >= 0 && ilim< MAX_IND);
    						if(tabsauts[i][isaut] > -1)
    							continue;
    						assert(ispot>= 0 && ispot< nbspots);
    						tabsauts[i][isaut] = tpsabs[ispot];
    					}
    				}
    	//...
    }
    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.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Au moment du plantage sur le delete:

    Call Stack:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    _free_dbg_lk(void * 0x0a911340, int 1) line 1033 + 60 bytes
    _free_dbg(void * 0x0a911340, int 1) line 970 + 13 bytes
    operator delete(void * 0x0a911340) line 351 + 11 bytes
    VitesseAccumulation(char * 0x0a5cda5c, double * 0x0a5ca280, int 317, double * 0x0a5c9f98, char * 0x0a5cd538, int 1) line 3681 + 21 bytes
    calc_vitacc(char * 0x0a5cda5c, double * 0x0a5ca280, int 317, double * 0x0a5c9f98, char * 0x0a5cd538, int 1) line 215 + 29 bytes
    APLW! 0052a229()
    0a5cd609()

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Je n'ai pas demandé la call stack, puisqu'on sait déjà où ça plante. Ce qu'il faut, c'est vérifier (avec des assertions, pour ne pas pénaliser en mode Release), avant chaque accès dans un tableau, qu'on ne fait pas de bêtise avec.

    Par exemple, ne pas se tromper de taille de tableau (NBMAXSAUTS, MAX_IND, nbInd, etc.).
    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.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 140
    Par défaut
    Ok, avec les assert je tombe direct sur une erreur ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    assert(isaut >= 0 && isaut < NBMAXSAUTS);
    probème d'origine de tableau etc etc ... je me replonge dans l'algo ....
    Je te tiens au courant mais en tout cas merci pour l'aide et pour les asserts que je ne connaissais pas !

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

Discussions similaires

  1. [MFC] Libération de mémoire allouée.
    Par Denn's dans le forum MFC
    Réponses: 9
    Dernier message: 03/01/2008, 11h53
  2. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  3. Libération de mémoire
    Par petitcoucou31 dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2005, 14h10
  4. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

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