[C] #define pour une fonction

Fermé
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 - 26 juil. 2010 à 13:07
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 - 29 juil. 2010 à 13:27
Bonjour,

J'utilise une fonction en cours qui est gotoxy sous windows. J'ai trouvé sont équivalant sous linux via la lib ncurses (https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ qui se trouve etre : mvprintw();
Mon probleme est que je créé mon programme généralement sous linux et que je doit rendre mon programme sous windows. Il est tres ennuyeux de reprendre le code source du programme et de modifié tout les mvprintw() par gotoxy();printf();

Je cherche donc un moyen via des define pour réglé le probleme, du genre :
#define WINDOWS
#ifdef WINDOWS
#define mvprintw(x_pos, y_pos, chaine, ...)           gotoxy(x_pos, y_pos); printf(chaine, ...);
#endif


Le véritable probleme ce pose ici, car printf() a un nombre variable de parametre tout comme mvprintw(). Ce qui fait que je n'arrive pas a placer les parametres de mvprintw() dans la fonction printf().


10 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
27 juil. 2010 à 20:22
Ou tout simplement, tu installes la bibliothèque nCurses sur Windows : PDCurses.

Cdlt,
2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
26 juil. 2010 à 14:10
salut.
Le préprocesseur travail juste sur le texte : donc impossible d'avoir un nombre d'argument variable.
ncurse n'existe pas pour windows, ça serait le plus simple.
Une solution serait de faire une fonction gotoxy_portable() prenant un nombre d'argument variable et d'appeler la fonction qui va bien.
0
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 5
27 juil. 2010 à 19:57
Salut,

C'est domage je voulais trouvé une réponce simple avec les macros du langage C.
Si pas oui je vais devoir réécrire une fonction mvprintw(); pour windows.
Je n'aurais qu'a ajouter un header avec ma fonction quand je recompile sous windows.
0
Dr.W Messages postés 390 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 29 juin 2011 40
Modifié par Dr.W le 27/07/2010 à 20:34
#if defined (linux)

// code

#endif

T'as le #else et le #elif qui te serviront aussi je pense.
0

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

Posez votre question
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 5
27 juil. 2010 à 22:57
ha merci, c'est ce que je cherchais.
Plus besoin de faire de fonction ^^
0
Dr.W Messages postés 390 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 29 juin 2011 40
Modifié par Dr.W le 27/07/2010 à 23:13
T'as pas vu mon message en commentaire? Tu peu faire autant de code source par archi que tu veu....

Si t'a envie tu peu mettre le #if defined dans le code directement pour changer juste une ligne en fonction de l'archi !
0
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 5
28 juil. 2010 à 13:24
non désolé, autant pour moi.

Pour ta solution, mon programme devra etre plus long a réalisé. Car je vais devoir faire :

#ifdef windows
gotoxy(x_pos, y_pos); printf("ma valeur est : %d", val);
#else
mvprintw(x_pos, y_pos, "ma valeur est : %d", val);
#endif

et cela pour chaque ligne ou j'utilise la fonction mvprintw(); dans mes programmes il y en a pas mal des fois. Mon but serai d'uitlisé mvprintw(); comme fonction principal, voir a la recreer sous windows mais vu que PDncurses existe déja pas besoin de le faire.
0
Dr.W Messages postés 390 Date d'inscription jeudi 15 avril 2010 Statut Membre Dernière intervention 29 juin 2011 40
28 juil. 2010 à 14:00
Oui c'est sur que c'est plus simple ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 28/07/2010 à 19:37
C'est pour ce genre de problème qu'il est conseillé de séparer le code portable (standard) du reste.
Par exemple, dans ton cas, tu aurais dû te créer une fonction ecrireXY(int x, int y) dans un fichier à part.
La fonction aurait été très simple avec un simple #ifdef. Si t'es sous Win, tu utilises gotoxy, sinon mvprintw.
Ainsi, tu n'as jamais beaucoup de changement à faire.

D'ailleurs, dans le même ordre d'idée, si PDCurses n'existait pas, tu aurais pu te créer la fonction mvprintw (avec un #ifdef pour pas qu'elle soit prise en compte sur Windows). Cette fonction aurait appelé gotoxy.

Cdlt,

Google is your friend
0
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 5
29 juil. 2010 à 00:12
oui l'idée est pas mal. Le seule problème que je rencontre est que la fonction mvprintw() est une fonction qui combine le gotoxy() et le printf()

le prototype de mvprintw() est le suivant :
mvprintw(const int x_pos, const int y_pos, char*, ...)

exemple :
mvprintw(x_pos, y_pos, "Ma valeur est : %d, ce qui donne %x en hexa", val, val);

Il faut donc creer une fonction qui analyse la chaine passé en parametre et remplacer tout les caractere %[a-z] par la variable correspondante passé en parametre. Et le nombres de ces variables n'est pas fixe.

Si je crée une fonction ecrireXY() je doit tenir compte des parametres que je vais passer au printf et au mvprinw. Ce qui n'est pas la solution la plus facile vu que mvprinw() est disponible sous windows avec PDncurses.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
29 juil. 2010 à 08:29
le prototype de mvprintw() est le suivant :
mvprintw(const int x_pos, const int y_pos, char*, ...)

Bien sûr, quand je parle d'écrire la fonction ecrireXY(), c'est au sens large. Je dis juste que dans l'idéal d'un projet où on est amené à utiliser des fonctions non portables, on s'écrit soit même la fonction et on exporte la définition de la fonction dans un autre fichier. Car, après, on se retrouve dans des cas comme le tien. Et encore t'as de la chance qu'une bibliothèque existe.

Il faut donc creer une fonction qui analyse la chaine passé en parametre et remplacer tout les caractere %[a-z] par la variable correspondante passé en parametre. Et le nombres de ces variables n'est pas fixe.
Oui, cela se fait sans problème en C.

Ce qui n'est pas la solution la plus facile vu que mvprinw() est disponible sous windows avec PDncurses.
Ce n'est pas la solution la plus facile, mais de loin la plus propre et la plus facile en maintenabilité dans des cas où une bibliothèque n'est pas externalisée...
0
kaham Messages postés 177 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 1 mars 2013 5
29 juil. 2010 à 13:27
Effectivement c'est plus propre et mon professeur ne sera certainement pas d'accord que j'utilise une nouvelle lib a la place de myconio.h

Par contre il n'a rien contre le fait que je crée une fonction qui facilite l'écriture des gotoxy() et printf()

Il faut donc creer une fonction qui analyse la chaine passé en parametre et remplacer tout les caractere %[a-z] par la variable correspondante passé en parametre. Et le nombres de ces variables n'est pas fixe.
Oui, cela se fait sans problème en C.


Mais il faut que je face cela avec les connaissances du cours je ne doit pas utilisé autre chose que ce que l'on a vu et c'est la que je suis coincé car les chaines de caractere on les a survolé. Il ma dit que si je ne faisais trop compliqué ca passerais.

Mais même si je crée cette fonction hors cadre du cours elle pourras toujours me servir quand je passe de linux a windows.
0