[C] Allocation dynamique et recuperation de donnees

Allocation dynamique et recuperation de donnees [C] - C - Programmation

Marsh Posté le 13-05-2004 à 17:29:25    

Bonjour a tous,
Probleme en programmation C avec les listes chainnees ...
 
Je m'explique:
-Nous avons differentes structures qui definissent des formes simples(cercle,point,ligne,triangle,rectangle et ellipse).
-Le tout est un logiciel de dessin style paint.
-L'utilisateur peux tracer des formes grace au clic souris car nous le gerons.
-Mais le probleme est pour reussir a creer une liste doublement chainee qui enregistre les formes crees par l'utilisateur ainsi que les coordonnees des formes(pour les tracer).
 
=>BUT:Enregistrer les operations de l'utilisateur au fur et a mesure qu'il les fait.De plus il faut pouvoir annuler la derniere forme tracee d'un des 6 types(carre,point, ...).
 
Merci de votre aide , la liste chainee etant une idee personnelle, si quelqu'un connait un meilleur moyen il est le bienvenu.

Reply

Marsh Posté le 13-05-2004 à 17:29:25   

Reply

Marsh Posté le 13-05-2004 à 17:40:09    

non cai bien

Reply

Marsh Posté le 13-05-2004 à 17:53:23    

Merci beaucoup mais j'aurais besoin d'aide pour mettre en place cette liste doublement chainee...
 
merci  ;)

Reply

Marsh Posté le 13-05-2004 à 17:54:57    

:heink:
comme une liste chaînée
mais avec 2 pointeurs au lieu d'un [:spamafote]

Reply

Marsh Posté le 13-05-2004 à 18:09:22    

pour quoi doublement ? tu peux également utilisé une simple pile

Reply

Marsh Posté le 13-05-2004 à 18:56:09    

moi je te conseille d'utiliser un simple tableau comme un buffer circulaire (à taille fixe donc)
 
dedans tu ranges ça
 

Code :
  1. enum Type { CERCLE, CARRE, ...};
  2. struct Element
  3. {
  4.   Type type;
  5.   union
  6.    { 
  7.       Cercle cercle; // ou carrément des pointeurs
  8.       Carre carre;   // à toi de voir
  9.   };


 
 
un exemple que j'ai déjà donné

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. enum Type
  4.   {
  5.     INTEGER,
  6.     REAL,
  7.     STRING
  8.   };
  9. struct Var
  10. {
  11.   enum Type type;
  12.   union
  13.   {
  14.     int i;
  15.     double f;
  16.     char str[128];
  17.   } data;
  18. };
  19. void Var_init_with_integer(struct Var *v, int i)
  20. {
  21.   v->type   = INTEGER;
  22.   v->data.i = i;
  23. }
  24. void Var_init_with_real(struct Var *v, double f)
  25. {
  26.   v->type   = REAL;
  27.   v->data.f = f;
  28. }
  29. void Var_init_with_string(struct Var *v, const char *s)
  30. {
  31.   v->type   = STRING;
  32.   strncpy(v->data.str, s, sizeof v->data.str);
  33.   v->data.str[ sizeof v->data.str - 1 ] = '\0';
  34. }
  35. void Var_print(const struct Var *v)
  36. {
  37.   switch(v->type)
  38.     {
  39.     case INTEGER:
  40.       printf("Var %d\n", v->data.i);
  41.       break;
  42.     case REAL:
  43.       printf("Var %f\n", v->data.f);
  44.       break;
  45.     case STRING:
  46.       printf("Var %s\n", v->data.str);
  47.       break;
  48.    
  49.     default:
  50.       printf("Var UNKNOW\n" );
  51.      
  52.     }
  53. }
  54. int main()
  55. {
  56.   struct Var v;
  57.   Var_init_with_integer(&v, 42);
  58.   Var_print(&v);
  59.   Var_init_with_real(&v, 69.69);
  60.   Var_print(&v);
  61.   Var_init_with_string(&v, "TazForEver" );
  62.   Var_print(&v);
  63. }


 

Reply

Marsh Posté le 13-05-2004 à 18:57:51    

à la limite, tu peux même faire des macros/fonctions pour accéder au bon champ, genre VAR_REAL(V) ((V).f)

Reply

Marsh Posté le 13-05-2004 à 22:59:37    

j'ai un jeu: CHERCHER L'ERREUR !!!!
 
-code:

Code :
  1. //debut de liste chainée
  2.   pnt=(struct _globale*)malloc(sizeof(struct _globale));
  3.     if(tete==NULL)
  4.       {
  5.  tete=pnt;
  6.  queue=pnt;
  7.  courant=pnt;
  8.       }
  9.     else
  10.       {
  11.  pnt->type_de_la_forme=POINT;
  12.  pnt->forme_figure.point.x1=x;
  13.  pnt->forme_figure.point.y1=y;
  14.  pnt->suivant=NULL;
  15.  pnt->precedent=queue;
  16.  queue->suivant=pnt; //!!  l'erreur survient a cette ligne ;)
  17.  queue=pnt;
  18.  afficherPoint(x,y);                                       //fin de liste chaine
  19.       }


 
/*sachant que l'on utilise un union et des pointeurs*/
 
-message d'erreur:
 

Code :
  1. error: dereferencing pointer to incomplete type


 
merci de votre aide

Reply

Marsh Posté le 13-05-2004 à 23:00:56    

déjà on a pas les types
 
et
 
    pnt=(struct _globale*)malloc(sizeof(struct _globale));
      queue=pnt;  
 
      pnt->suivant=NULL;
      queue->suivant=pnt;
 
 
tu vois l'erreur là ?

Reply

Marsh Posté le 13-05-2004 à 23:11:24    

Code :
  1. typedef struct _point
  2. {
  3.   int x1;
  4.   int y1;
  5.   int couleur;
  6. }point;
  7. typedef struct _ligne
  8. {
  9.   struct _point point1;
  10.   struct _point point2;
  11.   int couleur;
  12. }ligne;
  13. typedef struct _triangle
  14. {
  15.   struct _point point1;
  16.   struct _point point2;
  17.   struct _point point3;
  18.   int couleur;
  19. }triangle;
  20. typedef struct _cercle
  21. {
  22.   struct _point point1;
  23.   int rayon;
  24.   int couleur;
  25. }cercle;
  26. typedef struct _rectangle
  27. {
  28.   struct _point point1;
  29.   struct _point point2;
  30.   int couleur;
  31. }rectangle;
  32. typedef struct _ellipse
  33. {
  34.   struct _point point1;
  35.   int rayon1;
  36.   int rayon2;
  37.   int couleur;
  38. }ellipse;
  39. union _forme
  40. {
  41.   struct _point point;
  42.   struct _ligne ligne;
  43.   struct _triangle triangle;
  44.   struct _cercle cercle;
  45.   struct _rectangle rectangle;
  46.   struct _ellipse ellipse;
  47. };
  48. typedef struct _globale
  49. {
  50.   int type_de_la_forme;
  51.   int remplir;
  52.   union _forme forme_figure;
  53.   struct glb *suivant;
  54.   struct glb *precedent;
  55. }glb;


 
c'est ca que tu voulais????
 
pour ce qui est de la redirection vers le NULL, il faut voir que je crée un nouveau maillon, et que son suivant pointe vers le NULL.
ensuite je me sert de la queue pour pointer vers ce nouveau maillon et enfin je passe la queue à la fin ;)

Reply

Marsh Posté le 13-05-2004 à 23:11:24   

Reply

Marsh Posté le 13-05-2004 à 23:15:25    

int type_de_la_forme; -> utilise une enum !
 
utilise des majuscules au début de tes noms de types !
et si tu fais des typedef utilise les !
 
sinon ça ne me dit rien d'autre

Reply

Sujets relatifs:

Leave a Replay

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