Allocation tableau à 2 dimensions de double - > PLANTAGE

[Résolu/Fermé]
Signaler
-
 Pierrot94 -


Bonjour, bonjour,

J'ai constaté un phénomène étrange en compilant des tableaux à deux dimensions sur Visual C++ Express 2010.

En effet ce bloc de code compile avec un tableau à 2 dimensions de float:

float ** sommeDue;
sommeDue = (float **)malloc(nombreIntervenants * sizeof(float *));
for(int i = 0; i < nombreIntervenants ; i++)
sommeDue[i] = (float *)malloc(nombreIntervenants * sizeof(float));

Mais si je mets le même code avec un tableau à deux dimensions de double:

double ** sommeDue;
sommeDue = (double **)malloc(nombreIntervenants * sizeof(double *));
for(int i = 0; i < nombreIntervenants ; i++)
sommeDue[i] = (double *)malloc(nombreIntervenants * sizeof(double));

Ca fait planter le programme à l'allocation.

QQun a-t-il une idée où est ce tout simplement que le systême se protège et empêche l'allocation multidimensionnelle de tableaux à double pour éviter de pourrir la mémoire?

Merci de votre aide, j'ai pu continuer mon prog avec des float, mais je suis qd même contrarié parce qu'un double ** ça peut qd même servir...

Merci

Pierre

1 réponse

Aujourd'hui même plantage mais à la suppression des tableaux juste avant la fin du code, après delete [] participationIntervenants;

Voilà le code:
double ** sommeDue;
sommeDue = (double **)malloc(nombreIntervenants * sizeof(double *));
for(int i = 0; i < nombreIntervenants ; i++)
sommeDue[i] = (double *)malloc(nombreIntervenants * sizeof(double));
float * participationIntervenants = new float(nombreIntervenants);

for(int i = 0; i < nombreIntervenants ; i++)
{
cout << "Combien a paye en euros " << nomsIntervenants[i] << " ? " << endl;
cin >> participationIntervenants[i];
}
system("cls");

TRAITEMENT des données (je ne mets pas le code, cela ne plante pas dans cette zone)
Mais sachez que nombreIntervenants vaut 6, donc on a un tableau de 6*6 = 36 cases.

for(int i=0; i<nombreIntervenants; i++)
delete [] sommeDue[i];
delete [] participationIntervenants;

system("PAUSE");

return 0;

Lorsque je fais tourner en debug ça plante après delete [] participationIntervenants; et j'ai ce message qui s'affiche dans une fenêtre :
Windows a déclenché un point d'arrêt dans PartageDeFrais.exe.

Cela peut être dû à une défaillance du tas qui indique un bogue dans PartageDeFrais.exe ou l'une des DLL chargées.

Cela peut également être dû à l'appui sur la touche F12 lorsque PartageDeFrais.exe a le focus.

La fenêtre Sortie peut contenir des informations de diagnostic supplémentaires.

Je vous communique ce qu'il y a d'écrit dans la fenêtre de sortie de Visual:
'PartageDeFrais.exe' : Chargé 'C:\Users\Pierre\Documents\Visual Studio 2010\Projects\PartageDeFrais\Debug\PartageDeFrais.exe', Les symboles ont été chargés.
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\msvcp100d.dll', Les symboles ont été chargés.
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\msvcr100d.dll', Les symboles ont été chargés.
HEAP[PartageDeFrais.exe]: Heap block at 01127910 modified at 01127940 past requested size of 28
Windows a déclenché un point d'arrêt dans PartageDeFrais.exe.

Il me semble que c'était le même message que lors du précédent plantage.
Bref je suis un peu perdu.
C'est bon j'ai capté d'où ça venait.
Dans l'initialisation, il faut mettre des crochets et non des parenthèses.

float * participationIntervenants = new float [nombreIntervenants];

et non

float * participationIntervenants = new float (nombreIntervenants);

Par contre je n'ai pas encore l'explication pour ces dll non chargées (ntdll.dll, etc...voir plus haut dans mon message).
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 776
Ok, mais je te conseille quand même de ne pas utiliser du malloc en C++.
Pour les dll non chargés, c'est bizarre. Mais ce n'est pas du côté du C++ qu'il faut regarder.
Renomme ton fichier ntdll.dll, en ntdll.old et fais une récupération à partie du CD d'installation.
Je n'ai pas de cd de réinstallation. Je bosse sur une tablette Windows 8 Acer. Pour les dll ce pb a l'air récurrent chez pas mal de gens qui utilisent Visual C++ Express 2010.
Sur certains forums on préconise un Sleep(5000) au début du programme pour qu'il ait le temps de charger les dll, ou d'éxécuter visual c++ express 2010 en mode administrateur.
Ni l'une ou l'autre des solutions n'ont changé quoique ce soit sur mon poste.
J'ai été regarder, les Dll ont l'air d'exister, c'est le Visual qui écrit ne pas parvenir à les charger apparemment...

Disons que tant que j'arrive à faire tourner mon projet, ça va...(même si j'aimerais comprendre je repousse ça à plus tard).

Quoiqu'il en soit merci pour vos réponses.
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 776
Etrange. Je peux pas t'aider plus, je n'utilise pas cet outil.
J'espère que tu trouveras quelqu'un pour t'aider :-).
J'ai essayé Code Blocks mais Visual C++ Express est vraiment soigné...le debugger est très agréable à utiliser, j'accède à toutes les infos, dans code blocks c'est moins évident. Par exemple sommeDue[i][j] (quand i et j sont des compteurs) est évalué avec Visual C++, mais pas avec Code Blocks.

Sinon pour les DLL je confirme que Visual C++ écrit trois messages en sortie lorsque je fais tourner mon programme en debug indiquant un problème de chargement pour trois DLL:
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'PartageDeFrais.exe' : Chargé 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file

Or ces trois DLL 'ntdll.dll', 'kernel32.dll' et 'KernelBase.dll' existent bien dans 'C:\Windows\SysWOW64\'.
Le fait de démarrer Visual C++ Express 2010 en mode administrateur ne change rien à ce problème de chargement.
Le fait de rajouter un Sleep(5000) au début du déroulement du programme ne change rien non plus.

Ces trois messages d'erreur de chargement de DLL sont intrigants mais n'empêchent pas mon programme de fonctionner.