[C] définition d'une structure dynamique

définition d'une structure dynamique [C] - C - Programmation

Marsh Posté le 02-06-2004 à 14:47:39    

Bon voila je me pose la question suivante :  
je dois définir une structure qui sera presque tjrs identique à l'exception de un ou deux paramètres.
ors si je me trompe pas mes fonctions écrites pour un type ne seront pas compatibles avec un autre type.
Je voudrais donc savoir si on peut spécifier un Type général qu'on pourrait ensuite spécialiser par exemple en incluant des fichier h avec les nouvelles spécificités (sans modifier les fonctions).
 
Je sais qu'en ADA c possible par exemple sur les fichiers où on spécifie à l'écriture du code quels sont les types de fichier qu'on va ouvrir (fichier d'entier, d'enregistrement complexes...). Je voudrais faire la même chose mais avec des objets en mémoires.
 
voila j'espère avoir été assez claire.  :??:


---------------

Reply

Marsh Posté le 02-06-2004 à 14:47:39   

Reply

Marsh Posté le 02-06-2004 à 14:51:02    

tu ne peux pas. enfin pas simplement.
 
vite fais si ça te satisfait, tu peux jouer avec une union + enum
 
sinon, c'est des couches genre Glib ou OOC

Reply

Marsh Posté le 02-06-2004 à 15:04:06    

ok vais me renseigner sur le sujet. de toute façon j'ai le temps donc bah si il y a un moyen autant en profiter car je risque de devoir utiliser une dizaine de type différent avec des fonctions qui ne changent pas vraiment à l'exception des types des variables


---------------

Reply

Marsh Posté le 02-06-2004 à 15:04:57    

bah si tu en connais le nombre, la solution union + enum ça peut te satisfaire

Reply

Marsh Posté le 02-06-2004 à 15:05:56    

euh question bête et méchante : c quoi Glib et OOC ?


---------------

Reply

Marsh Posté le 02-06-2004 à 15:07:33    

une pseudo couche objet, OOC est un peu marginal mais facile à utiliser et performant.

Reply

Marsh Posté le 02-06-2004 à 15:10:19    

en fait non je connais pas vraiment. ça pourra varier d'un problème à l'autre. ça dépend de ce que les biologiste veulent. je pourrais a avoir à stocker des vitesses, des biomasses, des hauteurs d'eau, une bathymétrie...
ors c'est tjrs stocké dans un fichier texte mais avec des colonnes différentes.
et si un jour j'ai besoin de rajouter une nouvelle couches d'information de n'avoir juste qu'à créer un fichier h avec la structure de la nouvelle couche


---------------

Reply

Marsh Posté le 02-06-2004 à 16:25:43    

en utilisant un pointeur générique (void *) je pourrais pointer vers n'importe quel type de structure ? c'est à dire pointer par exemple vers un int ** ou un float **  
et donc si je le mes en paramètre dans la déclaration de mes fonctions je pourrais passer un peu près n'importe quoi dedans (tant qu'à l'intérieur de ces dernières je fasse attention aux incompatibilité de type).
C'est bien ça ? (c'est des notions totalement nouvelles qu'on apprend pas du tout à l'iut)


---------------

Reply

Marsh Posté le 02-06-2004 à 16:41:40    

bon j'ai rien dit sur le site :
http://flenu.ise-mons.be/cours/rappel/pointdef.php
bah ils disent c bon juste pour de l'affectation. donc j'en conclue qu'on ne peut pas mettre ça pour de la déclaration de fonction


---------------

Reply

Marsh Posté le 02-06-2004 à 16:50:28    

ah ouais mais attend, si tu veux stocker des données, c'est encore plus simple : union + enum, tu écris également l'énum et pan t'as le type de ta donnée

Reply

Marsh Posté le 02-06-2004 à 16:50:28   

Reply

Marsh Posté le 02-06-2004 à 17:11:48    

l'union permet de choisir tel ou tel type. ce qui implique donc de connaitre le type à l'avance. mais si je mes la structure dans un fichier à part je n'aurai donc qu'à modifier cette dernière pour modifier (ajouter ou supprimer) un type. Ensuite pour l'utilisation si mes types sont des pointeurs je peux donc allouer dynamiquement l'espace et pas perdre de place et avec l'union je sélectionne dans chaque fonctions quelle partie de ma structure je dois utiliser.
 
Donc au final si j'utilise un union dans ma structure suivante :
 

Code :
  1. typedef struct Tableau
  2. {
  3.     // tableau contenant les coordonnes du vecteur propre à un fichier
  4.     float ** tabCoordonnees;
  5.     // nombre de vecteurs vitesse
  6.     int NombreVecteur ;
  7.     // nom du fichier correspondant aux mesures;
  8.     char * NomDuFichier;
  9.     // heures de la mesure
  10.     char * HeureMesure;
  11.     // pointeur vers le tableau suivant
  12.     struct Tableau * suivant ;
  13. } TableauVitesse ; // nom final de la structure


 
à la place float ** tabCoordonnees;  
je pourrais donc au choix prend un int ** ou un mixte de tableau d'entier et de char * (qu'il faudra que j'inclue dans la déclaration bien sur)
bref je pourrais un peu tout faire c bien ça ? (à condition de prévoir les test pour savoir quelles sont les types utilisés à l'intérieur de mes fonctions).


---------------

Reply

Marsh Posté le 02-06-2004 à 17:15:04    

grande question aussi :  
l'union correspond donc à un OU
mais dans l'attribution de la mémoire si je choisis à un moment ou un autre de changer de type ne risque t-il pas de réécrire par dessus des valeurs correspondant à un élément précédemment sélectionné de l'union ?


---------------

Reply

Marsh Posté le 02-06-2004 à 17:21:19    

ben une union, c'est le même espace mémoire

Reply

Marsh Posté le 02-06-2004 à 17:27:17    

c'est à dire que si j'ai :
patate.autruche = 10
puis patate.tanga = 20
 
je perderai patate.autruche ?  
(bon en même temps je crois que ça ne génerais pas --> va réfléchir à ce problème ce soir en rentrant de son stage)


---------------

Reply

Marsh Posté le 04-06-2004 à 06:47:30    

oui

Reply

Marsh Posté le 04-06-2004 à 06:49:27    

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

un exemple simple
 
 
attention
 
e.x = ...;
... = e.y;
 
est indéfini

Reply

Sujets relatifs:

Leave a Replay

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