Rassembler plusieurs fichiers avec des #defines.

kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008 - 11 déc. 2005 à 08:26
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008 - 12 déc. 2005 à 08:53
Bonjour,
je galere un peu avec les #defines, en effet j'ai 4 fichiers dont 3 identiques a l'exeption des defines qui sont differents, je ne sais pas trop comment faire pour tout regrouper en 1 seul fichier. Ces defines modifient les types des fichiers, et je ne sais pas comment lui dire 'si je veux utiliser le fichier qui gere ce type la, alors utiliser ce define'.
Merci.

17 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
11 déc. 2005 à 13:54
Je pige rien. Si t'as 3 fichiers identiques (pk les define seraien
différents ?), tu peux en supprimer deux ... A mon avis, il y a un
problème dans la structure de ton programme. Détails un peu plus :)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 14:28
C'est quoi un "type de fichier"?
Peut-être que les templates résoudraient ton problème?
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 16:50
templates?
ben en gros j'appelle des fonctions, qui feront la meme chose, dans chaque fichier, mais elles vont recevoir un type different qui sera dans les #define,
exemple dans le fichier 1 j'ai:
#define LINT long int
fonction1(LINT) {ect}
et dans le deuxieme
#define UINT unsigned int
fonction1(UINT) {ect}
ect
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 16:55
Eh bien oui, tu devrais utiliser des templates: ca te permet d'écrire des fonctions qui prennent un type en paramètre
http://casteyde.christian.free.fr/cpp/cours/online/c4381.html
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 17:11
sinon oui ca a l'air pas mal..
mais je ne peux pas l'utiliser, c'est pour l'ecole et on doit rester en C.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 17:20
Qu'est ce qui change selon les types? Seulement la taille? Dans ce cas tu peux passer la taille en paramètre
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 17:27
Il y a juste le type que recois la fonction qui change,

#define LINT long int
fonction1(LINT nbr) {ect}
et dans le deuxieme
#define UINT unsigned int
fonction1(UINT nbr) {ect}
ect

J'ai oublier de mettre le nom des variables tout a l'heure.
Passer la taille en parametre?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 17:33
Bah pour l'instant, pour quelle raison tu ne peux pas rassembler toutes tes fonctions? Un cast ne suffit-il pas? Tu écris les fonctions pour le type le plus grand, et pour les autres tu castes, et tu castes...
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 17:45
non, je recode printf et j'utilise ca pour les flag h, l ou L, il faut prendre un argument de type short/long/double unsigned/int et se le trimballer, a moins que je fasse erreur mais il me semble que c'est quelque chose dans le genre..
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 17:51
Tu sais bien que printf n'a qu'un corps, et il ne sait pas ce que tu va lui passer comme type de données. Par exemple, tu peux considérer que ce sont tous des int et après tu fais des cast.
Mais peut être que je comprends mal, quel est le prototype de la fonction que tu codes?
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 18:07
je ne sais pas trop,
j'ai un "int my_printf (char *str, ...)"
je lui envoie un int par exemple avec un %d, il va la:
void my_print_no_mt(va_list *args, t_f *flag) {
flag->t 'd' || flag->t 'i' ? my_printnbr(flag, va_arg(*args, int)) : 0; ... }
puis my_printnbr recuper l'int et l'affiche

si je lui envoie un long int, avec %ld, il va la:
void my_print_l(va_list *args, t_f *flag) {
flag->t 'd' || flag->t 'i' ? pnbr_l(flag, va_arg(*args, long int)) : 0; ... }
et pareil my_printnbr recupere le long int et l'affiche

je m'y suis peutetre totalement mal pris je ne sais pas...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 18:11
oui, car il est possible d'afficher un int avec %c, du coup faudra l'interpréter comme un char. Ce que fait printf c'est analyser la chaine, quand il tombe sur un %d, il considère que l'argument qui vient est un int.
Par exemple, tu remarquera que tu peux très bien écrire ceci:

char s[] = "chaine";
printf("%d", s);

Ca va afficher un entier (l'adresse de la chaine)
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 18:18
oui pour le char j'avais en effet remarquer, si je ne prends que des int et que c'est un long ca bugger si j'entre quelque chose qui depasse un int (long unsigned int)? sinon je met des long long int partout ca passe?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
11 déc. 2005 à 18:32
J'ai pas très bien compris la fin de ta question...
Pour les long long int, tu fais pareil, je vois pas ce que ca change
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
11 déc. 2005 à 21:07
J'ai pas vraiment compris comment ca marchait en fait,
si j'envoie un long a printf il faut bien que je le recupere avec un long?
donc je vais toujours me retrouver avec mes 3 fichiers?
ou alors je mets des long long int partout comme ca tout logera forcement dedans? (mais alors quel est l'interet des flags modificateur de type)
ou alors le type qui recupere correspond au flag, et envoie a des fonctions qui recupere en long long int par exemple?
J'ai du loupe un truc en tous cas, desole je debute =)
0
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
11 déc. 2005 à 21:35
pour un printf()-like tu te base sur les flags seulement ...

tu te base pas sur des macros pour connaître le type des données



int ton_printf(const char * format, ...)

{

va_list l;

int int_value;

double dbl_value;

/* ... */



va_start(l, format);

/* ... */



while ( *format )

{

if ( *format == '%' )

{

switch ( *++format )

{

case 'd':

int_value = va_arg(l, int);

/* traitement du int */

break;

case 'f':

dbl_value = va_arg(l, double);

/* ... */

break;

/* etc... */

}

else {

/* caractère normal */

}

format++;

}

return une_valeur;

}



ton_printf("un entier: %d\nune chaine: %s\n", 1234, "ceci est une chaine");



pert pas ton temps avec toutes ces macros inutiles ...

mais si c'est vraiment ce que tu veux, tu pourrais définie _UNE_

macro pour tous tes fichiers :



#ifndef ___FICHIERXYZ__HEADER___

#define ___FICHIERXYZ__HEADER___



#if condition

# define LE_TYPE_ICI long

#elif autre_condition

# define LE_TYPE_ICI double

#elif ...

...

#endif



#if condition

# include "fichier_pour_xyz.h"

#elif condition

# include "fichier_pour_abc.h"

#elif ...

...

#endif



#endif /* #ifndef ___FICHIERXYZ__HEADER___ */



et dans les fichiers, tu utilise « LE_TYPE_ICI » ...





~(.:: NitRic ::.)~
0
kaervas Messages postés 51 Date d'inscription vendredi 25 novembre 2005 Statut Membre Dernière intervention 19 avril 2008
12 déc. 2005 à 08:53
NitRic oui au final j'ai fait quelque chose comme ca,
mais disons que les fonctions pour traiter les %ld, %hd %d sont les memes a part le type qui changeait, mais pas grave les 3 fichiers sont faits maintenant et au moins ca marche =)

Pour les macros j'ai pas vraiment compris comment ca marchait, elif endif ca me dit pas grand chose il faudrait que je me documente un peu (:

Merci de votre aide en tous cas.
0
Rejoignez-nous