Retourner aux forums || Retourner au forum Programmation.c
Programmation.c : Problème étrange
Posté par Moonz () le 27 août 2005Bonjour tout le monde,Je jouais avec fontconfig quand m'est venu l'envie de séparer l'ensemble de mon code (j'avais tout mis dans main()) en petit fonctions. Et voilà le problème: fontconfig refuse de fonctionner correctement hors de main(). Même si je mets tout dans une fonction main2 ayant la même signature que main, et que main ne contient que return main2(argc, argv), ça ne marche pas (en fait, il ne remplit pas la variable res, c'est pour ça que l'assertion res == FcFontMatch échoue). Essayez le code ci-dessous succesivement avec BUG non défini (tout le code est alors dans la fonction main()) puis avec BUG défini (le code est dans une fonction main2 appelée par main)
#include <stdlib.h>
#include <assert.h>
#include <fontconfig/fontconfig.h>
#ifdef BUG
# define FUNC_NAME main2
#else
# define FUNC_NAME main
#endif
int FUNC_NAME(int argc, char** argv) {
assert(FcInit() == FcTrue);
FcConfig *fc = FcConfigGetCurrent();
assert(fc != NULL);
FcPattern *pattern, *font_pat;
FcResult res;
pattern = FcPatternCreate();
assert(FcPatternAddString(pattern, FC_FAMILY, (FcChar8*)"Monospace") == FcTrue);
assert(FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_NORMAL) == FcTrue);
assert(FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN) == FcTrue);
assert(FcConfigSubstitute(fc, pattern, FcMatchFont) == FcTrue);
FcDefaultSubstitute(pattern);
font_pat = FcFontMatch(fc, pattern, &res);
assert(res == FcResultMatch);
FcPatternPrint(font_pat);
FcPatternDestroy(pattern);
FcPatternDestroy(font_pat);
FcConfigDestroy(fc);
FcFini();
return 0;
}
#ifdef BUG
int main(int argc, char** argv) {
return FUNC_NAME(argc, argv);
}
#endif
Une idée de la provenance de ce bug étrange ?
Merci d'avance :)> Lire le message (4 commentaires, moyenne: 1,5).
chez moi...
...l'assertion n'est vérifiée dans aucun des deux cas.
Un début de solution...
Il semblerait que la variable res n'est pas modifiée par la fonction FcFontMatch.
Si on l'initialise à -1, elle reste toujours à -1 et l'assertion n'est jamais vérifiée.
Dans ton programme, la variable res est initialisée à 0 dans un cas, ce qui correspond à FcResultMatch et ça marche, et dans l'autre cas, res est initialisée à une autre valeur et ça ne marche plus.
Ça doit être lié à l'état de la pile du programme où sont stockées les variables, ou à gcc ...
-
[^]Re: Un début de solution...
Posté par Moonz () le 30/08/2005 à 19:24. (lien). Évalué à 1.Je viens de regarder le code source de FontConfig, et effectivement FontConfig initialise correctement la variable result lors d'une erreur, mais pas lors d'un succès... Et à première vue, c'est une ligne de code à changer dans le code...
A votre avis, c'est un bug que je devais reporter+corriger, ou j'ai mal lu la documentation quelque part ? (parce que quand même, si c'était un bug, c'est assez gros, ça m'étonnerais que personne l'ai trouvé avant... Et j'ai beau relire la doc de la fonction FcFontMatch, il ne dit pas qu'on doit affecter la variable result à FcMatch avant l'appel à la fonction...)-
[^]Re: Un début de solution...
Posté par jlh () le 01/09/2005 à 17:07. (lien). Évalué à 1.Je ne sais pas si c'est un bug ou pas mais j'ai regardé comment cette fonction était utilisée par la bibliothèque pango et le contenu de la variable "res" n'est pas vérifié après l'appel de cette fonction.
Ils se contentent de vérifier que le pointeur "font_pat" n'est pas nul au retour de la fonction.
-
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.