[ansi] utilisation de types ou structures définis ailleurs ...

utilisation de types ou structures définis ailleurs ... [ansi] - C - Programmation

Marsh Posté le 24-01-2005 à 11:03:51    

Bonjour, j'essaye de recompiler mon programme C avec l'option -ansi ... et j'obtient l'erreur "parse error before "u_int_16" (ligne 3 dans le code suivant ):
 
 

Code :
  1. /* fichier .h */
  2. ERREUR getDeviceOnAllBusses(struct usb_bus *bus,
  3.                             u_int_16 idVend,
  4.                             u_int_16 idProd,
  5.                             struct usb_device **dev);


 
... sachant que j'ai avant, de nombreuses erreurs dues à l'inclusion de usb.h ... mais que je ne cherche pas à règler celles-la.
 
Savez-vous s'il y a un truc particulier pour la déclaration de paramètres de fonctions, dont le type est déclaré ailleur ?
 
J'avais aussi un problème sur la fonction :

Code :
  1. /* fichier.h */
  2. ERREUR printConfigDescriptor(struct usb_config_descriptor confDescr);


..cela donnait : "warning : parameter has incomplete type" ... obligé de passer par un pointeur pour enlever l'erreur :

Code :
  1. /* fichier.h */
  2. ERREUR printConfigDescriptor(struct usb_config_descriptor *confDescr);


 
Si vous avez des infos sur la facon d'utiliser des structures ou types particuliers, définis ailleurs ... si l'erreur vient de la ! Merci

Reply

Marsh Posté le 24-01-2005 à 11:03:51   

Reply

Marsh Posté le 24-01-2005 à 11:50:20    

salut,
 
abandonnes l'option -ansi. Quand tu fais un module, tu fais du C pour gcc, et tu utilises des extensions non standard de gcc (initialisation balisée, __init, __exit, ...). Ca ne compilera pas avec autre chose que gcc, pas la peine de se prendre la tete.
Compile avec -Wall pour etre portable pour gcc, sur toutes les architectures.
 

Reply

Marsh Posté le 24-01-2005 à 13:23:11    

Ben ouais, pour le module, je comptais laisser tomber l'ansi ... mais en fait, j'ai d'abord une petite appli n'utilisant que /usr/include/usb.h, et permettant de charger un firmware sur un microcontrolleur. Mes caméras usb sont en fait séries, mais branchées sur un boitier micro-controlleur cypress usb. Donc je charge le firmware, le cypress réénumère et la, mon module le prend en charge.
J'ai pour directives de coder en ansi, donc je voulais m'y référer chaque fois que possible. Dans tous les cas, je pense que je vais quand même laisser tomber cette norme.
 
Merci pour ta réponse !

Reply

Marsh Posté le 24-01-2005 à 16:25:17    

allawos a écrit :

Bonjour, j'essaye de recompiler mon programme C avec l'option -ansi ... et j'obtient l'erreur "parse error before "u_int_16" (ligne 3 dans le code suivant ):

Code :
  1. /* fichier .h */
  2. ERREUR getDeviceOnAllBusses(struct usb_bus *bus,
  3.                             u_int_16 idVend,
  4.                             u_int_16 idProd,
  5.                             struct usb_device **dev);


 
... sachant que j'ai avant, de nombreuses erreurs dues à l'inclusion de usb.h ... mais que je ne cherche pas à règler celles-la.
 
Savez-vous s'il y a un truc particulier pour la déclaration de paramètres de fonctions, dont le type est déclaré ailleur ?
 


Le 'aiileurs' doit être inclus. C'est certainement un .h. Celui-ci doit évidemment être protégé contre les inclusions multiples.
 
http://mapage.noos.fr/emdel/codage [...] ser_source
http://mapage.noos.fr/emdel/codage.htm#organiser

Citation :


J'avais aussi un problème sur la fonction :

Code :
  1. /* fichier.h */
  2. ERREUR printConfigDescriptor(struct usb_config_descriptor confDescr);


..cela donnait : "warning : parameter has incomplete type" ... obligé de passer par un pointeur pour enlever l'erreur :

Code :
  1. /* fichier.h */
  2. ERREUR printConfigDescriptor(struct usb_config_descriptor *confDescr);


 
Si vous avez des infos sur la facon d'utiliser des structures ou types particuliers, définis ailleurs ... si l'erreur vient de la !
 


Idem. Inclure le header qui va bien... Ceci-dit, passer une structure en paramètre est souvent une erreur de conception (en tout cas, c'est pas efficace). Il est en effet préférable de passer l'adresse de celle-ci.
 


---------------
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/
Reply

Marsh Posté le 24-01-2005 à 18:14:12    

Deux commentaires en complement de ce qui a deja ete dit :
 
1) Tu peux parfaitement passer un pointeur vers un structure dont tu n'as pas la definition interne, meme en C ansi. Tu peux faire :
 

Code :
  1. struct s;
  2. ...
  3. void func(struct s *ptr) { ... }


 
En general le "struct s;" sera mis dans un .h.
 
2) Par contre, tu ne peux evidemment pas passer en parametre une structure si tu n'as pas sa definition interne, que ce soit en C ansi ou autre. Lors de la compilation il faut reserver sur la pile une place suffisante pour les parametres, et il faut donc conaitre la taille exacte de la structure.
 
Bref tu peux passer un pointeur vers un type incomplet, mais tu ne peux pas passer directement un type incomplet.

Reply

Marsh Posté le 24-01-2005 à 18:34:08    

OK merci à tous.
 
En fait, j'avais évidemment inclu le .h définissant ma structure ... mais comme celui-ci ne compile pas en ansi, ben au moment ou le compilo voit mon prorotype, il rale, normal.
 
Bon du coup, j'ai effectivement viré le passage par structure pour passer par paramètre, c'est plus propre en effet, ... et je laisse tomber l'ansi !
 
Merci à tous !

Reply

Marsh Posté le 24-01-2005 à 19:29:31    

laisse tomber -ansi pour le code du module, pour le reste tu peux le conserver ;)

Reply

Sujets relatifs:

Leave a Replay

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