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

C++ Discussion :

librairie C dans Application C++


Sujet :

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 librairie C dans Application C++
    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
    void funcStaticLib(float[], float[], float, float[]);

    Pour exécuter cette fonction,
    je déclare les variables
    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 :
    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
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par nasboy3d Voir le message
    J'ai créé un fichier .lib basé sur la librairie SISL de Sintef.
    Tiens, c'est amusant, j'ai bossé dessus sur dans ma mission précédente, jusqu'en juillet. Tu bosses sur quoi ?

    Citation Envoyé par nasboy3d Voir le message
    Cette librairie est composée d'un très grand nombre de fonctions (>=600)
    Toutes avec un nom très explicite, tu l'auras noté. :-)

    Citation Envoyé par nasboy3d Voir le message
    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.
    Jette un œil sur cette page, au cas où...

    Je ne peux pas te faire part de mon expérience sur cette lib, car je le client voulait du code en C#, et je me suis donc coltiné la "traduction"...

  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 oodini.
    Quelle coincidence .....
    J'imagine ça ne doit pas etre fastoche de traduire du C en C#.
    A moins que t'as utilisé des lib C en C# .

    En fait moi je bosse sur un soft de modélisation 3D Nurbs utilisant principalement les capacités des nouveaux GPU.

    J'ai voulu utilisé cette librairie pour mon module de Génération de Primitives Nurbs à la place de l'existant car je la trouve mature et épuré de bugs (pas mal de soft l'utilisent en underground).
    Et tu l'aurais noté il est parfait pour etre plugé à une appli C++ (passage de param par pointeur, référence etc...).

    Mais mon problème est assez bizarre :
    Par exemple la génération Nurbs Sphere (nom de code s1023 ) fonctionne bien alors que la génération de Nurbs Cylindre (nom de code s1022) plante à l'exe.

    Sinon Es-ce qu'il y a une chance que les paramètres passés à une fonction soient corrompus avant d'entrer dans le corps de cette fonction ?

  4. #4
    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
    ç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

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut!,

    Je ne vois qu'une solution: veiller à caster, correctement, tes float en double avant de les filer à la bibliothèque

    Le problème, c'est que si les fonctions renvoyent des double, tu perdra de la précision au moment de faire l'inverse: le compilateur te lancera des avertissements à tour de bras
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    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
    Le problème, c'est que si les fonctions renvoyent des double, tu perdra de la précision au moment de faire l'inverse: le compilateur te lancera des avertissements à tour de bras
    Oui ça c'est clair...mais les fonctions ne renvoient pas des doubles dans la version que j'ai modifié...tout est maintenant en float.
    Le gros pb est que j'ai d'énormes contraintes,

    1 - par ex quand je dois récupérer un pointeur(tableau) de l'une de ces fonctions et le passer à mon renderer Opengl.
    Ce serait complètement inéfficace de convertir le tableau en float (surtout si ça fait un size de 1000) avant de l'utiliser.
    Les appli 3D sont très sensibles.

    2 - je sais certains vont me dire opengl 4x / GLSL supporte les buffers double mais je dois garder la compatibilité avec les Geforce G80 donc Opengl 3.3.

    Sinon, je tiens à souligner que ce forum est très efficace et j'adore la mentalité qui y règne.

Discussions similaires

  1. Embarquer des librairies dynamiques dans mon application
    Par antoine.roux dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 30/05/2009, 09h24
  2. Réponses: 3
    Dernier message: 18/09/2007, 14h54
  3. Réponses: 2
    Dernier message: 06/04/2006, 17h44
  4. [Java-Swing][HTML] Page html à inclure dans application Java
    Par terminagroo dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/07/2005, 10h04
  5. [OC4J 9.0.2] plusieurs modules clients dans application.xml
    Par Mokhtar BEN MESSAOUD dans le forum Autres
    Réponses: 2
    Dernier message: 11/02/2005, 10h18

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