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 :

Problème de migration VS2005 -> VS2010


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut Problème de migration VS2005 -> VS2010
    Bonjour,

    Mon problème est plutôt délicat, je vais donc essayé d'être le plus clair possible.
    Nous sommes entrain de faire la migration de nos projets de VS2005 à VS2010.

    Nous avons:
    * Un projet "core".
    * Un projet "ui" qui permet de tester les fonctionnalité du "core"
    * Un projet "serveur" qui utilise le "core"

    "ui" et "core" font parties de la même solution.
    "server" link à la compilation avec les .lib de "core"

    L'utilisation de "ui" et "core" fonctionne bien.
    C'est l'utilisation de "server" qui pose problème.

    Si le sénario suivant ce produit: "server" instancie un objet "obj1core" appartenant à "core" et "obj1core" instancie lui même un objet "obj2core" appartenant également à "core".
    Depuis le code de "server" nous pouvons demander à "obj1core" de nous retourner un pointeur sur "obj2core". Cela fonctionne, et le débuguer nous montre que le pointeur pointe bien sur un espace mémoire alloué.
    Par contre, si nous appelons une fonction sur "obj2core", disons "obj2core->anyFunc()", le this-pointeur à l'intérieur de anyFunc() est nul.

    Voici un petit exemple simplifié (mais analogue) pour expliquer mon problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void aFuncInServer()
    {
      Obj1core o1;
      Obj2core *o2 = o1.getO2(); // Fonctionne, il est possible de parcourir o2 avec le débugueur
      o2->anyFunc() // Leve une exception "writing access violation", ca le 'this' pointeur est null dans anyFunc
    }
     
    class Obj1core
    {
      Obj2core *o2;
     
      public:
      Obj1core()
      {
        o2 = new Obj2core();
        o2->anyFunc(); // Fonctionne, le résultat est visible au débugueur
      }
     
      Obj2core* getO2() {return o2;}
     
      [...]
    };
     
     
    class Obj2core
    {
      char* str;
     
      public:
      Obj2core()
      {
        str = new char[5];
      }
     
      anyFunc()
      {
        str[0] = 'c'; // Si l'appel vient de aFuncInServer 'this' est null, si l'appel vient de o1 'this' a la bonne valeur
      }
    }
    Toute aide me sera très utile et je vous en remercie d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    je ne pense pas que le passage de 2005 à 2008 soit la cause du problème.
    quand on crée des objets dynamique dans le constructeur il faut gérer les exceptions qu'est ce qui ce passe si l'allocation de l'objet échoue ?
    car je suppose que l'exemple posté est loin de la réalité ...
    je ne sais pas comment tout ça est réparti , mais si ces différentes classes sont dans libs différentes il faut veiller a ce que tous les modules utilisent la CRT de la même manière : /MD (dll) ou /MT (static)

  3. #3
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    Salut farscape,

    Et surtout merci de ta réponse. En fait, c'est bien le passage 2005 -> 2010 qui pose problème, car le même code avec le même input fonctionne en version 2005.

    Par ailleurs, je viens tout juste de régler mon problème en récréant une nouvelle solution from scratch et en important les sources existantes. C'était donc un problème de param de mon projet, mais malheureusement je ne l'ai pas exactement localisé :-( Domage pour ceux qui liront ce post.

    Quoi qu'il en soit ça tourne et je te remercie beaucoup de ta réponse

    A+
    Ju

  4. #4
    Membre émérite
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 419
    Par défaut
    A oui, je voudrais ajouté que malgré ce que dit MS, le passage 2005 -> 2010 n'est pas si facile. C'est vrai que ça compile du premier coup, mais il y a des pb à l'exécution.
    Il y a d'abord des pb de changement de la STL. Par exemple les itérateurs sont deprecated et sont remplacés par les itérateurs constants. Mais il y a aussi d'autres problème. Par exemple en 2005, la STL précisée que pour un clear() sur un vector il fallait vérifié que le vector était vide, mais l'implémentation le supporté. Si comme chez moi un dév avait omit ce détail, vous aurez des bug à l'exécution.
    Pour finir, je pense avoir découvert un autre problème sur les vector, mais comme je n'ai pas encore eu le temps d'approfondir, je ne le détaillerais pas pour l'instant. Si ça se confirme, je mettrais à jour ce post pour éviter à d'autres de galérer.

    Bref, je veux bien croire que le passage 2008->2010 fonctionne du premier coup, mais ce n'est pas le cas pour 2005->2010...


    A+
    Ju

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème migration VS2005 vers VS2008 Compact framework
    Par tonave dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 14/02/2012, 16h43
  2. Migration de VS2005 vers VS2010
    Par lisco dans le forum MFC
    Réponses: 1
    Dernier message: 30/08/2010, 14h06
  3. Réponses: 2
    Dernier message: 20/01/2009, 16h25
  4. Problème de migration vs2003 vs2005
    Par shenron666 dans le forum VC++ .NET
    Réponses: 9
    Dernier message: 13/07/2007, 23h13
  5. Problème de migration
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2005, 10h37

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