IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Mystere avec librairie statique


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Points : 23
    Points
    23
    Par défaut Mystere avec librairie statique
    Salut Ami(e)s Développeurs
    J'ai un problème assez mystérieux :
    J'utilise VC++ 2010
    J'ai créé un fichier .lib basé sur la librairie SISL de Sintef.
    Cette librairie est composée d'un très grand nombre de fonctions (>=600) toutes écrites en C et ont l'air prets à etre plugés à une grosse application en c++ (présence de extern C, ....).
    J'ai pu généré un seul .lib correspondant à toutes ces fonctions.
    Pour les appeler dans mon appli j'utilise un header + le.lib au linkage.
    Le problème est le suivant :
    Pour une raison quelconque, certaines fonctions plantent à l'exécution, d'autres non.
    En débugant j'ai remarqué que certains paramètres passés à la fonction se trouvant dans le .lib changent de valeur une fois dans le corps de cette fonction.

    Ex :
    Supposons que le prototype de la fonction dans le .lib est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void funcStaticLib(float[], float[], float, float[]);
    Pour exécuter cette fonction,
    je déclare les variables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float tab1[3] = {0.0,1.0,0.0};
    float tab2[3] = {1.0,1.0,0.0};
    float val = 1.0;
    float res[3];
    puis j'appelle ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    funcStaticLib(tab1, tab2, val, res);
    La fonction plante et quand je lance le debugger VC2010
    je remarque en entrant dans le corps de funcStaticLib que
    tab1 a tjrs la meme valeur
    tab2 devient un pointeur invalide
    val prend la valeur 2.37636763 E+18 pâr ex.

    Vous ete d'accord avec moi que c'est totalement incompréhensible...comme si entre la déclaration des variables et le passage de paramètres, il s'est passé quelque chose

    Voilà j'epère que je me suis fait bien comprendre.

    Toute aide sera plus que appréciée.
    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 175
    Points : 12 302
    Points
    12 302
    Par défaut
    Passer un tableau de float (ou d'autre chose) comme paramètre d'une fonction. C'est totalement pourri.
    Il y a un nombre conséquent de choses qui me viennent à l'esprit comme motif plausible de merdoyage.

    options de compilations sur l'alignement des structures,
    la différence de représentation des floats lors de la compilation des deux modules,
    mécanismes d'optimisation agressif lors du passage de tableaux,
    politique très peu claire dans la "norme" C de la copie de paramètre de type tableau de l'appelant à l'appelé.

    Donc si vous le pouvez, passez par des choses bien plus carrées comme des références const ou des pointeurs et des structures strictement déclarée (tailles, alignement, etc.) dans le .h de la librairie.

    Sinon, comme je vois plein de cas foireux, j'irais directement à la source, c'est à dire dans le code assembleur de la fonction appelant pour voir comment les paramètres sont recopié (ou pas) dans la pile et comment le code de la fonction appelée récupère et interprète ces paramètres.

    En Debug, ces mécanismes sont particulièrement simples sur une machine 32 bits. Si vous travaillez sur une machine 64 bits, essayez de généré du code 32 bits. Si c'est le bordel, il y a de grande chance que cela soit le même en 32 et en 64 bits.

    Oui, connaître l'assembleur sert à quelque chose.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Points : 23
    Points
    23
    Par défaut
    Merci bacelar...
    ça y est je sais d'où vient le problème.
    En fait c'est totalement de ma faute car j'ai du changer les variables utilisés dans cette librarie (de double en float) pour l'adapter à mon soft existant.
    Et comment j'ai procédé ? Comme ceci :
    Un gros Replace de Notepad ++ sur le répertoire contenant toutes les fichiers.
    Je pensais pas que ça pourrait venir de là car il n'y avait aucune ambiguité à ces replace.
    Là j'ai buildé la version originale et ça marche bien.

    Bon là le pb est juste translaté car je ne peux pas utilisé ces fonctions tel quel.
    Il me faut la version avec des float.
    Je vais chercher ce qui cloche. Sinon si vous avez des idées, je suis preneur...
    Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 175
    Points : 12 302
    Points
    12 302
    Par défaut
    Jetez un coup d'œil au code assembleur généré pour les problèmes d'alignement, de convention d'appel etc...

Discussions similaires

  1. compilation avec librairie statique
    Par hector2 dans le forum Fortran
    Réponses: 4
    Dernier message: 04/05/2010, 11h39
  2. Comment lier une application avec une librairie statique ?
    Par michel_bbm dans le forum Visual C++
    Réponses: 7
    Dernier message: 08/04/2008, 14h49
  3. edition de lien avec librairie statique
    Par vision_opencv dans le forum Linux
    Réponses: 3
    Dernier message: 06/08/2007, 01h09
  4. Création et utilisation de librairies statiques avec Code::Blocks
    Par somberlord dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 22/07/2007, 08h58
  5. Réponses: 2
    Dernier message: 19/08/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo