Allocation tableau à 2 dimensions de double - > PLANTAGE

Résolu/Fermé
Pierrot94 - 27 mars 2013 à 18:42
 Pierrot94 - 30 mars 2013 à 00:22


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
A voir également:

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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
28 mars 2013 à 22:23
Bon déjà, si tu utilises delete, utilise plutôt new pour allouer (au lieu de malloc).

Sinon tu as oublié le delete pour sommeDue (tu ne l'as fait que sur les sommeDue[i])

Sinon, peux-tu poster ton code en entier et entre des balises "code" (à droite du bouton "souligné"). Parfois en C et en C++, l'erreur est fait ailleurs et ne se manifeste que bien plus tard.
0
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).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
29 mars 2013 à 07:21
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.
0
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
29 mars 2013 à 23:38
Etrange. Je peux pas t'aider plus, je n'utilise pas cet outil.
J'espère que tu trouveras quelqu'un pour t'aider :-).
0