Bonjour,
Je suis en train de développer un petit projet utilisant ncurses en C.
Dans ce projet, j'utilise unicode (wchar_t) et le codage utf8. Aucun problème avec printf() et dérivés, tout baigne dans l'huile.
Mais impossible de travailler avec ncurses (et c'est pourtant nécessaire dans ce projet).
Par exemple, les fonctions wadd_wchstr() et waddwstr() semblent ne pas être reconnues lors de la compilation (j'obtiens le diagnostique : " implicit declaration of function 'wadd_wchstr’ ", alors que, j'ai vérifié, le prototype existe dans ncurses.h. D'autre part, ces même fonctions ne sont pas retrouvées lors de la phase de link-edit, j'obtiens : "undefined reference to `wadd_wchstr'".
J'ai bien essayé d'envoyer une chaîne de type utf-8 comme une simple chaîne, mais cela ne produit pas les résultats escomptés. Dons inutile de biaiser de cette façon.
Mon implémentation de ncurses me semble correcte tant que je n'utilise pas unicode, puisque la totalité de mes logiciels l'utilisant se comporte correctement.
Alors, si quelqu'un a une idée de solution, je suis preneur avec d'immenses remerciements.
# C'est parce qu'il manque un petit détail
Posté par Christophe --- . Évalué à 5.
Alors dans le désordre:
ces même fonctions ne sont pas retrouvées lors de la phase de link
J'ai jeté un oeil sur la page de man, il y a cette note:
NOTES
Note that all of these routines except waddnwstr may be macros.
donc ça peut expliquer pourquoi il ne la trouve pas lors du link.
Ensuite, il y a le problème de la compilation:
le prototype existe dans ncurses.h
il est bien défini, mais si tu regardes plus haut, tu verra que tout ce qui concerne les wchar est entouré d'un:
#ifdef _XOPEN_SOURCE_EXTENDED
Il faut que tu compiles en rajoutant l'option -D_XOPEN_SOURCE_EXTENDED, car le support des wchar n'est pas standard, c'est une "nouveauté" de X/Open Unix.
Et la normalement, tu vas te rendre compte que ça passe (presque) mieux... Sauf qu'il reste encore une surprise: Il ne faut pas linker avec -lcurses mais avec -lcursesw pour que ça marche.
[^] # Re: C'est parce qu'il manque un petit détail
Posté par abgech . Évalué à 1.
Je te remercie de ta réponse, elle me dépanne.
En ce qui concerne le contenu de ncurses.h, je devrais peut-être apprendre à lire ...
Par contre pour la librairie libncursew.a, je n'ai pas vu où cela est décrit. As-tu une référence sur une doc ncurses et Unicode ?
Encore merci.
[^] # Re: C'est parce qu'il manque un petit détail
Posté par Christophe --- . Évalué à 2.
je devrais peut-être apprendre à lire
Oh ben non, je te rassures, le problème ne se situe pas au niveau de tes yeux, mais de l'expérience. Je me suis déjà fait avoir par un problème identique il y a quelques années, et j'y avais perdu quelques heures...
À ce propos: Piege à connaitre... un certains nombre de #ifdef des headers n'ont pas le droit d'être définis tels-quels, il faut passer par un nom plus générique qui est convertis dans le features.h qui est inclus partout.
pour la librairie libncursew.a, je n'ai pas vu où cela est décrit
Peut-être... par ce que ça n'est écris nul part? Je t'avoue je n'ai pas cherché sur le sujet, mais je m'était fait un test-case de cinq lignes pour comprendre ton problème, et c'est comme cela que j'ai vu que tu y aurais une erreur... Petit coup de locate sur la bibliothèque, de ls pour voir ce qu'il y a autours, et de tenter avec le cursesw au fort potentiel...
Par contre; je n'ai malheureusement aucune doc à te proposer sur le sujet...
<ma-vie>
Justement aujourd'hui j'ai failli re-tomber sur le problème: j'ai utilisé la fonction dlsym, erreur de compilation... mais j'ai eu de la chance, dans la page de man il y a le message pour le -D_GNU_SOURCE, ouf...
</ma-vie>
Ce serait peut-être pas mal de proposer aux mainteneurs de ncurses:
- de rajouter l'info sur -D_XOPEN_SOURCE_EXTENDED dans les notes des pages concernées;
- de parler de la lib cursesw dans la page générale de curses...
moi je vais pas le faire, mais j'ai une excuse: je suis un boulet associal paresseux incurable, alors...
[^] # Re: C'est parce qu'il manque un petit détail
Posté par abgech . Évalué à 1.
Je te prends en flagrant délit de mensonge. Non seulement tu as pris la peine de me répondre, mais tu l'as fait en ayant pris sur ton temps pour tenter une manip afin de me dépanner.
Bon, comme j'écris relativement bien l'anglais, je vais envoyer un courriel aux développeurs.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.