Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1263 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Généricité ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Généricité ?

n°1146885
pascal_
Posté le 11-07-2005 à 18:36:24  profilanswer
 

J'ai des fonctions pour gérer des listes:

Code :
  1. list* listNew( );
  2.   void listAddLast( list *l, void *data );
  3.   ...


c'est bien joli, mais le contrôle des types est pas terrible et ça oblige à avoir des cast un peu partout.
 
Maintenant, si j'écris :

Code :
  1. #define TYPEDEF_LIST_OF( n, t )\
  2.   typedef list list##n;\
  3.   list##n* (* const list##n##New)()  = (list##n* (*)())listNew;\
  4.   void (* const list##n##AddLast)( list##n*, t* ) = (void (*)( list##n*, t* )) listAddLast;


 
en ayant:

Code :
  1. typedef struct{
  2.     int i;
  3. }toto;


 
je peux "déclarer" un type de liste de toto :

Code :
  1. TYPEDEF_LIST_OF( Toto, toto );


 
et écrire :

Code :
  1. listToto *l = listTotoNew();
  2.    
  3.   toto *t = malloc( sizeof(t) );
  4.   t->i = 1;
  5.    
  6.   listTotoAddLast( l, t );


 
en sachant que si j'écrit par exemple:

Code :
  1. int *i;
  2.   ...
  3.   listTotoAddLast( l, i );


gcc me sort un warning.
 
C'est un peu  :pt1cable:, mais ça à l'air de marcher à peu près...
 
Qu'est ce que vous en pensez ? Portatibilité, c'est bien / pas bien, il y a mieux ... ?
 

mood
Publicité
Posté le 11-07-2005 à 18:36:24  profilanswer
 

n°1146914
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-07-2005 à 19:05:29  profilanswer
 

pascal_ a écrit :

J'ai des fonctions pour gérer des listes:

Code :
  1. list* listNew( );
  2.   void listAddLast( list *l, void *data );
  3.   ...


c'est bien joli, mais le contrôle des types est pas terrible et ça oblige à avoir des cast un peu partout.


  • Contrôle de type pourquoi faire ? Le gestionnaire de liste n'a pas à connaitre la nature des données. Une adresse anonyme suffit (void * est donc exactement ce qu'il faut).


  • Des casts pourquoi faire ? Le C garantit que les conversions T* -> void* et void* -> T* sont implicites et ne nécessitent pas de cast.


  • Ok, j'ai lu et testé la suite et c'est correct... Maintenant, est-ce utile ? Pourquoi pas... Ajouter void quand une fonction n'a pas de paramètre.


#define TYPEDEF_LIST_OF( n, t )\
   typedef list list##n;\
   list ## n * (* const list ## n ## New)(void)  = (list ## n* (*)(void))listNew;\
   void (* const list ## n ## AddLast)( list ## n*, t* ) = (void (*)( list ## n*, t* )) listAddLast


Message édité par Emmanuel Delahaye le 11-07-2005 à 21:33:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1146968
Taz
bisounours-codeur
Posté le 11-07-2005 à 19:42:52  profilanswer
 

ouaip. Moi j'aime bien l'interface des GList de la glib.

n°1147075
pascal_
Posté le 11-07-2005 à 20:53:34  profilanswer
 

Utiles? Je trouve que c'est plus lisible et plus sécurisant.
 
C'est sûr, on peut s'en passer, mais manipuler du void*, avant ça ne me gênait pas, mais maintenant je trouve que c'est une trop grosse source d'erreur/confusion et j'aimerais éviter si possible...
 
 
edit: ils sont où mes cast en trop  :??: ?


Message édité par pascal_ le 11-07-2005 à 20:55:14
n°1147098
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-07-2005 à 21:31:35  profilanswer
 

pascal_ a écrit :

Utiles? Je trouve que c'est plus lisible et plus sécurisant.
 
C'est sûr, on peut s'en passer, mais manipuler du void*, avant ça ne me gênait pas, mais maintenant je trouve que c'est une trop grosse source d'erreur/confusion et j'aimerais éviter si possible...
 
 
edit: ils sont où mes cast en trop  :??: ?


 
Ok, j'ai rien dit.
 
Je corrige.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1147154
Chronoklaz​m
Posté le 11-07-2005 à 22:06:11  profilanswer
 

Joli mais vivent les langages non-typés :)


Message édité par Chronoklazm le 11-07-2005 à 22:07:49

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1147182
chrisbk
-
Posté le 11-07-2005 à 22:17:12  profilanswer
 

Emmanuel Delahaye a écrit :

  • Contrôle de type pourquoi faire ? Le gestionnaire de liste n'a pas à connaitre la nature des données. Une adresse anonyme suffit (void * est donc exactement ce qu'il faut).




 
ouais surtout quand on veut patater des ints dans une liste, vive le void * \o/

n°1155283
docmaboul
Posté le 20-07-2005 à 19:50:12  profilanswer
 

pascal_ a écrit :

Qu'est ce que vous en pensez ? Portatibilité, c'est bien / pas bien, il y a mieux ... ?


 
Ben, c'est bien. En faisant un peu différemment, avec une macro pour les déclarations et une autre pour les définitions, on peut se faire quelque chose qui ressemble aux templates du C++. Par contre, ça peut être embêtant au débuggeur.

n°1155286
chrisbk
-
Posté le 20-07-2005 à 19:53:53  profilanswer
 

docmaboul a écrit :

Ben, c'est bien. En faisant un peu différemment, avec une macro pour les déclarations et une autre pour les définitions, on peut se faire quelque chose qui ressemble aux templates du C++. Par contre, ça peut être embêtant au débuggeur.


 
un brin, sans parler de la lisibilité d'une bonne macro faite a coup de \


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Généricité ?

 

Sujets relatifs
qu'est ce que l'on apelle : "de la genericité" ?Questions sur la généricité.
[VC++] GénéricitéUtiliser la généricité sans imposer un JRE compatible 1.5
Généricitéasp: pb. de généricité.. Kel mot hein ??!!
Plus de sujets relatifs à : [C] Généricité ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR