Forum Programmation.c Problème étrange

Posté par  .
Étiquettes : aucune
0
27
août
2005
Bonjour 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 :)
  • # chez moi...

    Posté par  (site web personnel) . Évalué à 2.

    ...l'assertion n'est vérifiée dans aucun des deux cas.
  • # Un début de solution...

    Posté par  . Évalué à 2.

    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  . É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  . É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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.