Allocation dynamique d'une matrice : en C [Fermé]

- - Dernière réponse :  nassima - 14 déc. 2015 à 21:34
Bonjour,
je veux créer un tableau a 2 dimension en C dont sa taille est entrée par l'utilisateur et cette taille est assez grande (la matrice est au moins de taille 100*100) sauf que lors de l'exécution mon ordinateur se plante je sais pas si c'est un problème de mémoire ou c'est une mal utilisation des pointeurs ou une mal création de la matrice elle même.
Merci de répondre le plus vite possible et de me renseigner ou bien sur un cours complet de C qui traite ce genre de problème ou quelque chose qui peut m'aider
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
38
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
30 août 2013
19
3
Merci
l'allocation statique est très simple à faire, mais si jamais tu dois utiliser des pointeurs dans ton programme alors tu as prendre en compte que les valeurs de la matrices sont de la forme **; pas seulement *.
Mais une solution bien plus simple si tu as un probleme de mémoire ce qui peut probable (allocation dynamique)
voila du code::(c'est le constructeur de la classe matice)
matrice(int l,int c,int m)
{
int i;
M=(int**) malloc (sizeof(int*)*l);
for (i=0; i<l; i++)
Aj[i]=(double*) malloc (sizeof(int)*c);
}


amine

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 67130 internautes nous ont dit merci ce mois-ci

#include <stdio.h>
#include <stdlib.h>
// Allocation Dynamique du Tableau - Matrice5.c

int main(int argc, char *argv[])
{
int i,j,l,nbColA,nbColB, k, l2;

double **A;
double **B;
double **P;

////////////////////////A//////////////////////

printf("Donner le nombre des lignes de la matrice A\n");
scanf("%d",&l);
printf("Donner le nombre des colonnes de la matrice A\n");
scanf("%d",&nbColA);

A=(double **) malloc(l*sizeof(double*));

for (i=0; i<l; i++)
A[i]=(double *) malloc(nbColA*sizeof(double));

printf("Enter les elements de la matrice A\n");
for(i=0;i<l;i++)
for(j=0;j<nbColA;j++)
{
printf("Enter la valeur de A[%d][%d] ",i,j);
scanf("%lf",&A[i][j]);
printf("\n");
}
printf("\n===> Matrice A <===\n");
for (i=0;i<l;i++)
{
for(j=0;j<nbColA;j++)
printf("%lf ", A[i][j]);
printf("\n");
}

////////////////////////B//////////////////////

B=(double **) malloc(l*sizeof(double*));
l2=nbColA;
printf("le nombre des lignes de la matrice B est %d\n",l2);
printf("Donner le nombre des colonnes de la matrice B\n");
scanf("%d",&nbColB);

for (i=0; i<l2; i++)
B[i]=(double *) malloc(nbColB*sizeof(double));

printf("Enter les elements de la matrice B\n");
for(i=0;i<l2;i++)
{
for(j=0;j<nbColB;j++)
{
printf("Enter la valeur de B[%d][%d] ",i,j);
scanf("%lf",&B[i][j]);
printf("\n");
}
}

printf("\n===> Matrice B <===\n");
for (i=0;i<l2;i++)
{
for(j=0;j<nbColB;j++)
printf(" %lf ", B[i][j]);
printf("\n");
}

////////////////////////P//////////////////////
P=(double **) malloc(l*sizeof(double*));

for (i=0; i<l; i++)
P[i]=(double *) malloc(nbColA*sizeof(double));

/* la matrice résultante est la matrice P */



printf("Le produit des matrices A et B est la matrice P : \n");

for (i = 0; i < l; i++)
for (j = 0; j <nbColB; j++)
{
int k;
P[i][j] = 0;
for (k = 0; k < nbColA; k++)
{
P[i][j] = P[i][j] + A[i][k] * B[k][j];
}
}




printf("\n===> Matrice P <===\n");
for (i=0;i<l;i++)
{
for(j=0;j<nbColB;j++)
printf("%lf ", P[i][j]);
printf("\n");
}

return 0;

free(A);
free(B);
free (P);



}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 > JLDR69 -
Salut,
Mettre du code après le return 0, ça sert strictement à rien.
De plus, tu n'as pas libéré toute la mémoire. Il y aura plein de zones dans le heap qui ne seront pas désallouées.
> JLDR69 -
bravo très bien magnifique
très bien magnifique
Messages postés
232
Date d'inscription
dimanche 11 mai 2008
Statut
Membre
Dernière intervention
1 août 2008
24
0
Merci
Bonjour,
Il faut bien déclarer le tableau après avoir mis ça taiille dans une variable (ou deux d'ailleurs)
Merci mais comment je dois faire j'ai tout essayer
Jean_38
Messages postés
232
Date d'inscription
dimanche 11 mai 2008
Statut
Membre
Dernière intervention
1 août 2008
24 > nadia09 -
ça fait un petit moment que j'ai pa fait de c mais si tu fais

int mavar;
tu demande la taille tu la met dans mavar avec (scanf() ou get()
et ensuite tu déclare le tableau
char tab[mavar] par exemple

pareil avec deux dimensions
Messages postés
70
Date d'inscription
dimanche 24 décembre 2006
Statut
Membre
Dernière intervention
9 février 2012
2
0
Merci
fait nous voire ce que t'as fais :)
0
Merci
Bonjour, bonjour,

J'ai eu un pb similaire au tien, j'ai constaté un phénomène étrange en compilant des tableaux à deux dimensions sur Visual C++ Express.

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...

Par contre pas de pb sur CodeBlocks...

Merci

Pierre
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1620 -
Dans l'idéal, il faut rouvrir un poste. Cela est plus clair.
Sinon cela doit marcher avec double. Si cela ne fonctionne pas c'est que tu as dû faire une coquille. Colle exactement ce que tu as mis et mets le message d'erreur.
Je te conseille vivement de tester egalement le retour des malloc pour savoir quel malloc est le responsable.
J'ai mis exactement ce qu'il y a plus haut, par contre ça ne plante plus aujourd'hui au même endroit mais à la fin après le delete du tableau.
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));

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 [] sommeDue;
delete [] nomsIntervenants;
delete [] differentiel;
delete [] participationIntervenants;

system("PAUSE");

return 0;

Lorsque je fais tourner en debug ça plante avant le return 0 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 au dernier plantage après l'allocation.
J'ai ouvert un nouveau post à cette adresse: http://www.commentcamarche.net/forum/affich-27460615-allocation-tableau-a-2-dimensions-de-double-plantage#p27468049
-1
Merci
Bonjour,

Tu peux nous mettre ton code de déclaration et d'initialisation de tes tableaux stp ?.