begin process at 2012 05 28 07:20:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Algorithme

 > 

Maths

 > 

Allocation dynamique d'une matricec


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Allocation dynamique d'une matricec

vendredi 22 octobre 2010 à 21:45:13 | Allocation dynamique d'une matricec

djou45

Bonjour,

Je suis débutant en C, et j'ai un problème avec ce programme ci dessous.
Je pense que le problème est dans cette partie:
Code C/C++ :
matrice init(int nbDeLignes, int nbDeColonnes)
{
  int i, i0, i1;
  int size_Mat = nbDeLignes*nbDeColonnes;
  matrice mat = allouerMatrice();
  mat->nbDeLignes = nbDeLignes;
  mat->nbDeColonnes = nbDeColonnes;
  mat->data = malloc(nbDeLignes*nbDeColonnes*sizeof(int));
/*
 ERROR
*/
  for(i=0; i< size_Mat; ++i)           
           (mat->data)[i] = i;
return mat;
}


quand j'essaye d'initialiser la matrice, le programme s&#8217;exécute mais ya une erreur d'accès memoire je pense.
Peut être dans l'allocation de l'espace memoire.


Si quelqu'un peut m'aider

Code C/C++ :


#include<stdio.h>
#include<stdlib.h>

typedef double typeDeDonnees;

typedef struct matrice {
int nbDeLignes ;
int nbDeColonnes ;
typeDeDonnees *data;
} * matrice ;

// allocation de l'espace associe a un pointeur vers matrice
matrice allouerMatrice()
{
return (matrice)malloc(sizeof(struct matrice));
}

// initialisation d'une matrice (et allocation dynamique pour les donnees)
matrice init(int nbDeLignes, int nbDeColonnes)
{
int i, i0, i1;
int size_Mat = nbDeLignes*nbDeColonnes;
matrice mat = allouerMatrice();
mat->nbDeLignes = nbDeLignes;
mat->nbDeColonnes = nbDeColonnes;
mat->data = malloc(nbDeLignes*nbDeColonnes*sizeof(int));
/*
ERROR
*/
for(i=0; i< size_Mat; ++i)
(mat->data)[i] = i;


return mat;
}

void affiche(matrice mat)
{
int i0, i1;
int NBL = mat->nbDeLignes;
int NBC = mat->nbDeColonnes;
printf("Nombre de ligne = %d\n",NBL);
printf("Nombre de colonne = %d\n",NBC);
for (i0=0; i0<NBL; i0++){
printf("\n");
for (i1=0; i1<NBC; i1++)
printf("%d ",mat->data[i0*NBC+i1]);
}
}
//addition de deux matrices
matrice addition(matrice mat1, matrice mat2)
{
if ( mat1==NULL || mat2==NULL)
{ // l'un des deux pointeurs n'est pas alloue
fprintf(stderr,"%s:%d> ERREUR: addition",__FILE__,__LINE__);
exit(EXIT_FAILURE);
}
else
{

}
}

// desallocation des matrices
void liberer(matrice mat)
{
if (mat != NULL)
free(mat->data);
free(mat);
}

int main()
{

matrice mat1 = init(3,5);
matrice mat2 = init(3,5);
matrice mat3 = NULL;
affiche(mat1); // ERROR
liberer(mat1);
system("pause");
/* affiche(mat2);
affiche(mat3);

mat3 = addition(mat1,mat2);
affiche(mat3);*/

liberer(mat1);
liberer(mat2);
liberer(mat3);

return EXIT_SUCCESS;
}

samedi 23 octobre 2010 à 00:46:31 | Re : Allocation dynamique d'une matricec

Chouchou182

Réponse acceptée !
Salut,

Que se passe-t-il si tu modifie la ligne d'allocation par:

Code C/C++ :
mat->data = malloc(nbDeLignes*nbDeColonnes*sizeof(*mat->data));


De manière générale, tu peux écrire
Code C/C++ :
t = malloc(n * sizeof(*t));

n est le nombre d'objets que pourra contenir ton tableau t.

Attention en outre dans ta fonction main, il y a deux appels consécutifs à liberer.

Bonne prog,
--
Chouchou.
samedi 23 octobre 2010 à 01:26:59 | Re : Allocation dynamique d'une matricec

djou45

Merci,

l'erreur c'est: quand j'exécute le program ça affiche la console d'exécution et les deux premières lignes correctement
Code C/C++ :
printf("Nombre de ligne = %d\n",NBL); 
printf("Nombre de colonne = %d\n",NBC)


ensuite y a deux zéro qui apparient est là erreur Windows ( le programme à cessé de fonctionner).

j'ai même apporté les modification à ça
Code C/C++ :
mat->data = malloc(nbDeLignes*nbDeColonnes*sizeof(*mat->data));

j'ai commenté aussi le deuxième libérer, Mais l'erreur persiste

franchement, je sais pas c'est quoi le problème.

si j'exécute le programme sans cette partie:
Code C/C++ :
/* 
ERROR 
*/ 
for(i=0; i< size_Mat; ++i) 
(mat->data)[i] = i; 

ça m'affiche une matrice avec de grands chiffre et si je met la boucle en modifiant i< 2
Code C/C++ :
for(i=0; i< 2; ++i) 
(mat->data)[i] = i;


le programme marche sans erreur est affiche les deux première valeur à 0 ensuite des grands chiffres alors que normalement les deux premières valeurs sont i=0 ensuite i=1.

et si je met i < 3 ou plus, là erreur system.

samedi 23 octobre 2010 à 01:56:06 | Re : Allocation dynamique d'une matricec

djou45

Merci Chouchou182,

enfaite ta réponse est presque juste, seulement :
Code C/C++ :
  mat->data = malloc(nbDeLignes*nbDeColonnes*sizeof(double));
  // initialisation de la matrice
  for(i=0; i< size_Mat; ++i)           
           mat->data[i] = sqrt(i);

J'ai mis
Code C/C++ :
sizeof(double)
et ça marche très bien

Merci
lundi 25 octobre 2010 à 17:55:52 | Re : Allocation dynamique d'une matricec

DeAtHCrAsH


Salut,

Si ta matrice est destinée à sauvegarder des int je ne vois pas pourquoi tu utiliserai des doubles.
Si on fait du C c'est pour la performance, pas pour mettre des rustines dans le code qui cont par la suite impacter sur la qualité.

Pour ton erreur, ton initialisation des data et mauvaise :

[code]
for(i=0; i< size_Mat; ++i)
(mat->data)[i] = i;
[/code]

Tu débutes ta boucle à 1 et tu la termine a nbLignes*nbColonnes + 1.
En gros tu essayes d'écrire dans une zone mémoire qui ne t'appartient pas.

Remplace donc ton ++i par i++ et garde ton code initial.

Shell
lundi 25 octobre 2010 à 18:29:09 | Re : Allocation dynamique d'une matricec

Chouchou182

Salut,

Désolé Shell, tu dois être un peu fatigué...

Le programme complet suivant:
Code C/C++ :
#include<stdio.h>

const int MAX = 10;

int
main()
{
  int i;
  for ( i = 0 ; i < MAX ; ++i )
    printf(">  %d\n", i);
  return 0;
}

produit bien (le résultat attendu):
Code :
>  0
>  1
>  2
>  3
>  4
>  5
>  6
>  7
>  8
>  9


++i et i++ sont différents en tant qu'expressions. En tant qu'instructions, c'est exactement pareil.

En ce qui concerne l'allocation, je maintiens le conseil donné plus haut et inspiré de la faq de fr.comp.lang.c:

12.2 Comment allouer proprement une variable ?

Le plus portable et le plus simple est de faire ainsi :

var_t * ma_var = malloc(N * sizeof *ma_var);

Si le type de la variable change, l'allocation est toujours
valide. À noter que l'on ne caste pas le retour de malloc()



Enfin, si c'est l'affichage qui plante, regarde la ligne
Code C/C++ :
printf("%d ",mat->data[i0*NBC+i1]);

Est-ce que pour afficher un double, "%d" est ce qu'il convient ? gcc suggère :

warning: format '%d' expects type 'int', but argument 2 has type 'double'



Bonne prog,
--
Chouchou.
lundi 25 octobre 2010 à 21:10:11 | Re : Allocation dynamique d'une matricec

DeAtHCrAsH


Salut Chouchou,

Shame on me! Je n'ai plus les yeux en face des trous et en plus en me relisant je viens de voir que mon explication ne correspond pas à l'idée que je souhaitais faire passer.
Promis je prendrais le temps de relire au prochain coup ;)

Shell


Cette discussion est classée dans : int, matrice, mat, nbdelignes, nbdecolonnes


Répondre à ce message

Sujets en rapport avec ce message

Problème pour dériver une classe [ par arc59 ] J'ai créé une classe Matrice comportant des fonctions get_ele, set_ele (toutes les 2 sont "virtual") et la redéfinition de l'opérateur +.Dans ma class ArrayList (C#) vers int ** [ par typhoonx ] Bonjour, je voudrai réaliser une conversion d'un ArrayList contenant un ArrayList pour chaque case du premier ArrayList en int ** dans le but d'appele matrice de caractere en c [ par flofloo ] slt tout le monde voici mon probleme : char **Init_Matrice_IrcMSG(int ligne,int colone){     char **mat = NULL;     int i;     mat = surcharges des operators [ par leroiloup ] salut a tout j'ais un probleme d'implementer les deux operator (operator+, operator*) et comment l'etuliser dans main() #include #include using names class matrice [ par ciaonataha ] J'ai ecrit le programme classe matrice...mais j'ai les error comme:"matrice.cpp:269: error: no match for 'operator=' in 'b = matrice::Mat_decomposer(a Une matrice est-elle transitive ? [ par 69Vincent ] Bonjour. Tout d'abord enchanté d'être sur le forum! Je suis un étudiant à l'IUT A de Lyon et j'ai quelques petits problème en C. Voilà le problème : O Multiplication matrice [Matrice c++] [ par joshua69 ] Bonjour, je dois réaliser un algorithme utilisant la méthode de Cholesky pour la décomposition en matrice L.Lt. voici mon code: #include #include taille d'une matrice [ par badsha ] je cherche un programme qui calcule la taille d'une matrice.(sur matlab c simple : size(matrice) est basta). j'ai trouvé un code qui calcule la taill


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales