Se connecter / S'enregistrer
Votre question

[ C ] Liste d'arguments variables : RedHat

Tags :
  • format
  • Programmation
Dernière réponse : dans Programmation
21 Septembre 2004 15:46:29

Bonjour, vous qui venez comprendre mon probleme 8) Je suis en train de faire une phase de tests de migration et de portage d'UNIX SCO vers Red Hat Enterprise. Et bien entendu j'ai des erreurs à la compilation de mes .pc. Parmi les nombreuses erreurs j'ai :trace.c:125: number of arguments doesn't match prototype[/quote]
Ce qui correspond dans le fichier trace.c à : ...
121 void trace_ecrire (p_nom_fonction, s_niveau, p_format, va_alist)
122 char *p_nom_fonction;
123 short s_niveau;
124 char *p_format;
125 va_dcl
126 {
127 static char ...
[/quote]
qui va apparemment avec #include <varargs.h> [/quote]
dans le fichier trace.h j'ai ceci qui me pose aussi probleme : void trace_ecrire (char*, short, char*, ...);[/quote]
Si quelqu'un pouvait m'expliquer comment retablir ca et a quoi ca sert, ce serait hyper sympa. Merci d'avance. Cordialement,
Melle Elise78
[/color]

Autres pages sur : liste arguments variables redhat

21 Septembre 2004 15:56:10

Le symptôme de ton problème est lié au fait que tu n'appelle pas la fonction trace_ecrire avec le bon nombre d'arguments.
Je n'ai pas le code en entier pour comprendre, quoi que le va_dcl est bizarre .. je ne le comprends pas.

En tout cas dans le .h tu dois avoir le prototype de ta fonction void trace_ecrire(char, short, char , et le dernier type que je ne connais pas)

et dans le .c, la fonction et toutes celles qui l'appellent.
21 Septembre 2004 16:03:45


Et oui justement, je ne connaissais pas non plus avant de le voir !! ;-)
Ca marche très bien sous UNIX SCO dans l'état ou c'est mais sous RedHat Enterprise ca n'a pas l'air de faire des émules ...
les trois points de suspensions dans le prototype servent à définir une fonction avec un nombre d'arguments aléatoire, en fonction de l'appel. et ca surement grace a l'include <varargs.h> ... en plus je ne sais pas ce que c'est que ce va_dcl mais c'est aussi normal .. mais a quoi ca sert ???

ma question est comment je fais pour que ca marche sous Linux RedHat :-( ??
:-?[/color]
Contenus similaires
Pas de réponse à votre question ? Demandez !
21 Septembre 2004 17:42:21

Euh, tu es sur qu'il n'y a pas une erreur et qu'il faudrait plutot l'accolade entre la ligne 121 et 122 ?
Car ca ressemble a une déclaration de fonction ?
Pourtant le compilateur a l'air de prendre ca pour un appel de fonction ?, pourtant cet appel (l. 121) est vraimment bizarre, pourquoi tu mets void avant ? Pourquoi il n'y a pas de point virgule a la fin ? Pourquoi tu as des déclarations de variables juste apres ?
Je comprends pas la.

Je pense que la solution a ton probleme c'est ca, mais j'en suis pas sur a 100% :
Pour ton problème, c'est simple mais compliqué pour ton portage : varargs.h c'est dépassé maintenant c'est stdarg.h, bon en théorie les versions de linux sont encore compatibles avec mais je pense que dans la réalitée cela doit poser beaucoup de probleme. :-o
Je viens de regarder sur mon linux, j'ai encore le varargs.h et la définition de va_dcl existe encore. Mais l'utilisation des varargs.h a la place de stdargs.h peut peut etre poser probleme.

Verifies quand meme ca :
- Va dans ton fichier varargs.h sous RedHat, et regarde dedans si tu as un appel a va_dcl. Et maintenant fait de meme avec Unix.

Le mieux ce serait de :
- Reécrire ton programme avec stdargs.h (les déclarations sont tres proches : man stdargs).
Par contre va_dcl, n'existe plus il faut donc voir a quoi ca correspond, j'ai regardé vite fait sur mon fichier h sur Linux, c'est un define qui declare une variable de type va_list.

Pour l'instant le mieux c'est que tu fasses un vrai copier coller ou retaper bien le code et en mettre un peu plus si ca te déranges pas :-) Car j'aimerais pas te dire de conneries.
21 Septembre 2004 18:31:38

Et voili


Citation :
void trace_ecrire (p_nom_fonction, s_niveau, p_format, va_alist)
char *p_nom_fonction;
short s_niveau;
char *p_format;
va_dcl
{
static char sz_fonction[] = "@(#) trace_ecrire v0.0";

long l_temps;
char sz_date[LG_DATE_TIME_ABREGE+1];
FILE *p_fichier = NULL;
va_list p_var;

if ( ... )
{
...
va_start (p_var);
vfprintf (gp_fichier_trace, p_format, p_var);
va_end (p_var);
...
}
}
21 Septembre 2004 18:46:09

Es-tu sur que sous ton unix le prototypage est identique.

Difference C ansi, C unix ...

C'est autre chose mais si tu utilises des #define Verifis bien la cohérence des valeurs d'un environnment à l'autre ;-)
21 Septembre 2004 19:54:07

Remplace :
Citation :

void trace_ecrire (p_nom_fonction, s_niveau, p_format, va_alist)
char *p_nom_fonction;
short s_niveau;
char *p_format;
va_dcl
{


par :
Citation :

void trace_ecrire (char *p_nom_fonction, short s_niveau, char *p_format, ...)
{


Voila, ca devrait marcher... si c'est le meme principe qu'avec les stdargs.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS