Type de donnée abtrait : Matrice

Type de donnée abtrait : Matrice - C - Programmation

Marsh Posté le 29-11-2009 à 12:54:34    

Bonjour,
 
Dans le cadre d'un projet de programmation en langage C, je dois définir le type de donnée abstrait "Matrix" pour pouvoir manipuler des matrices chainées. Voici le schéma d'une matrice 2*2 :
 
http://img7.hostingpics.net/pics/785964MATRIX.png
 
Voici ma déclaration du type :
 

Code :
  1. typedef struct cellElem
  2. {
  3. int row;
  4. int col;
  5. float value;
  6. struct cellElem* nextCol;
  7. struct cellElem* nextRow;
  8. }cellElement;
  9. typedef struct colElem
  10. {
  11. int colN;
  12. struct colElem* nextCol;
  13. struct colElem* prevCol;
  14. cellElement* col;
  15. }colElement;
  16. typedef struct rowElem
  17. {
  18. int rowN;
  19. struct rowElem* nextRow;
  20. struct rowElem* prevRow;
  21. cellElement* row;
  22. }rowElement;
  23. typedef struct
  24. {
  25.         int col;
  26.         int row;
  27.         colElement* cols;
  28.         rowElement* rows;
  29.         }matrix;
  30. typedef matrix* Matrix;

 
 
Le problème c'est que je n'arrive même pas à accéder à la valeur d'une case de la matrice ("value" dans la structure "cellElement" ).
 
Si par exemple je fais ça...
 

Code :
  1. int main(int argc, char* argv[])
  2. {
  3.      Matrix M;
  4.      M=(Matrix)malloc(sizeof(matrix));
  5.      M->cols->col->value=5.;
  6.      printf("%f", M->cols->col->value);
  7.      system("PAUSE" );
  8.    
  9. }


 
...le programme compile mais plante à l'exécution. Je dois donc avoir une erreur dans la déclaration du type ou dans le main. Je précise que je suis débutant.
 
Merci d'avance.

Reply

Marsh Posté le 29-11-2009 à 12:54:34   

Reply

Marsh Posté le 29-11-2009 à 13:12:00    

aragus68 a écrit :

Bonjour,
 
Dans le cadre d'un projet de programmation en langage C, je dois définir le type de donnée abstrait "Matrix" pour pouvoir manipuler des matrices chainées. Voici le schéma d'une matrice 2*2 :
 
http://img7.hostingpics.net/pics/785964MATRIX.png
 
Voici ma déclaration du type :
 

Code :
  1. typedef struct cellElem
  2. {
  3. int row;
  4. int col;
  5. float value;
  6. struct cellElem* nextCol;
  7. struct cellElem* nextRow;
  8. }cellElement;
  9. typedef struct colElem
  10. {
  11. int colN;
  12. struct colElem* nextCol;
  13. struct colElem* prevCol;
  14. cellElement* col;
  15. }colElement;
  16. typedef struct rowElem
  17. {
  18. int rowN;
  19. struct rowElem* nextRow;
  20. struct rowElem* prevRow;
  21. cellElement* row;
  22. }rowElement;
  23. typedef struct
  24. {
  25.         int col;
  26.         int row;
  27.         colElement* cols;
  28.         rowElement* rows;
  29.         }matrix;
  30. typedef matrix* Matrix;

 
 
Le problème c'est que je n'arrive même pas à accéder à la valeur d'une case de la matrice ("value" dans la structure "cellElement" ).
 
Si par exemple je fais ça...
 

Code :
  1. int main(int argc, char* argv[])
  2. {
  3.      Matrix M;
  4.      M=(Matrix)malloc(sizeof(matrix));
  5.      M->cols->col->value=5.;
  6.      printf("%f", M->cols->col->value);
  7.      system("PAUSE" );
  8.    
  9. }


 
...le programme compile mais plante à l'exécution. Je dois donc avoir une erreur dans la déclaration du type ou dans le main. Je précise que je suis débutant.
 
Merci d'avance.


 
M->cols est Non affecté => Comportement indéfini => Segmentation Fault
 
Il faut donc que tu créée une fonction d'initialisation "initMatrix" par exemple pour initialiser ta structure.
 
Tu devrais tester le retour de la fonction malloc. Il n'est pas forcément pertinent de cacher des pointeurs derrière des typedef. Je trouve ça source de confusion.


Message édité par Anonymouse le 29-11-2009 à 21:43:48
Reply

Marsh Posté le 29-11-2009 à 17:06:34    

Citation :

Il n'est pas forcément pertinent de cacher des pointeurs derrière des typedef. Je trouve ça source de confusion.


 
Mais comment puis-je faire autrement tout en respectant le schéma donné plus haut ?

Reply

Marsh Posté le 30-11-2009 à 21:45:50    

aragus68 a écrit :

Citation :

Il n'est pas forcément pertinent de cacher des pointeurs derrière des typedef. Je trouve ça source de confusion.


 
Mais comment puis-je faire autrement tout en respectant le schéma donné plus haut ?


 
Utilise matrix* tout court.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed