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 :

Variable globale et méthodes ?


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Juillet 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Etudes

    Informations forums :
    Inscription : Juillet 2010
    Messages : 54
    Par défaut Variable globale et méthodes ?
    Bonjour,

    Dans le cadre d'un projet perso, je souhaite utiliser une bibliothèque externe, la Orfeo Toolbox pour ceux qui veulent savoir.

    J'utilise une méthode d'un pointeur sur un objet d'une classe de cette bibliothèque externe pour lire un fichier.
    L'argument attendu est un std::string, que je mets donc.

    Et là PAF! à l'exécution : SIGABRT.

    Bizarrement par contre, quand je met une variable globale en argument, aucune erreur de rencontrée.

    Quelque chose m'a échappée mais quoi ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Peut-être que quelque chose t'a échappé. Avec un extrait du code (avec tous les types utilisés) on pourrait surement t'aider. D'autant que la phrase "J'utilise une méthode d'un pointeur sur un objet d'une classe ..." me laisse perplexe.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Juillet 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Etudes

    Informations forums :
    Inscription : Juillet 2010
    Messages : 54
    Par défaut
    Voici un extrait de mon code :

    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
     
    #include <iostream>
    #include "Access.h"
    #include "otbImageFileReader.h"
    #include "itkImageRegionIterator.h"
    #include <armadillo>
    #include "H5Cpp.h"
     
    using namespace H5;
     
     
    const H5std_string	FILE_NAME("spectraMoffetROI.h5");
    const H5std_string	GROUP_NAME("lib dataset");
    std::string FILE_NAME_IMAGE("../cupriteSubHsi.tif");
    void readImage(const std::string fname, typename otb::VectorImage<double, 2>::Pointer image);
    int main()
    {
        //reading image
        const unsigned int d = 2;
        using PixelType = double;
        using ImageType = otb::VectorImage<PixelType, d>;
        using ReaderType = otb::ImageFileReader<ImageType>;
        typename ReaderType::Pointer reader = ReaderType::New();
        std::string fname = "../cupriteSubHsi.tif";
        reader->SetFileName(fname); // SIGABRT
        reader->SetFileName(FILE_NAME_IMAGE); // MARCHE PARFAITEMENT
     
    //etc..
    }
    Et la fonction appelée, qu'on trouve sur le doxygen de OTB

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    template <class TOutputImage, class ConvertPixelTraits>
     void ImageFileReader<TOutputImage, ConvertPixelTraits>::SetFileName(const std::string& extendedFileName)
     {
       const std::string skip_geom_key = "skipgeom";
       const std::string geom_key      = "geom";
     
       // First, see if the simple filename has changed
       typename FNameHelperType::Pointer helper = FNameHelperType::New();
     
       helper->SetExtendedFileName(extendedFileName);
       std::string simpleFileName = helper->GetSimpleFileName();
     
       if (simpleFileName == this->m_FileName)
       {
         // Then, see if the option map changed
         const typename ExtendedFilenameHelper::OptionMapType& newMap = helper->GetOptionMap();
         const typename ExtendedFilenameHelper::OptionMapType& oldMap = m_FilenameHelper->GetOptionMap();
     
         // Both maps are not completely the same
         if (oldMap.size() != newMap.size() || !std::equal(oldMap.begin(), oldMap.end(), newMap.begin()))
         {
           this->Modified();
     
           // Now check if keywordlist needs to be generated again
           // Condition is: one of the old or new map has the skip_geom
           // key and the other does not
           // OR
           // one of the old or new map has the geom key and the other
           // does not
           // OR
           // both have the geom key but the geom value is different
           if ((oldMap.count(skip_geom_key) != newMap.count(skip_geom_key)) || (oldMap.count(geom_key) != newMap.count(geom_key)) ||
               ((oldMap.count(geom_key) && newMap.count(geom_key)) && oldMap.find(geom_key)->second != newMap.find(geom_key)->second))
           {
             m_KeywordListUpToDate = false;
           }
         }
       }
       else
       {
         this->m_FileName      = simpleFileName;
         m_KeywordListUpToDate = false;
         this->Modified();
       }
     
       m_FilenameHelper = helper;
     }
    Ca ne m'aide pas trop :/.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    En effet, la seule différence est l'utilisation d'une locale au lieu d'une globale.
    Je pense que ça pourrait venir d'une incompatibilité de méthode d'appel de fonction. La bibliothèque doit impérativement être compilée avec la même version de bibliothèque de base que l'application, sinon ça peut provoquer des anomalies. Je ne vois que ça comme piste possible.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Le code prend un const& et en fait une copie interne.
    Je pense que ton problème vient d'ailleurs et tu as juste de la chance de pouvoir le repro en utilisant une variable locale.
    Le debugger sera certainement plus utile.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Juillet 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Etudes

    Informations forums :
    Inscription : Juillet 2010
    Messages : 54
    Par défaut
    Citation Envoyé par dalfab Voir le message
    En effet, la seule différence est l'utilisation d'une locale au lieu d'une globale.
    Je pense que ça pourrait venir d'une incompatibilité de méthode d'appel de fonction. La bibliothèque doit impérativement être compilée avec la même version de bibliothèque de base que l'application, sinon ça peut provoquer des anomalies. Je ne vois que ça comme piste possible.
    Tu veux dire que je dois refaire la compilation à la main de l'API que j'ai téléchargé ?

    Dans mon CMakeLists, j'ai dû réactiver l'ABI (qui était désactivée dans le CMakeList de cette bibliothèque externe), autrement il y avait incompatibilité entre la bibliothèque HDF5 et l'OTB (les fonctions HDF5 n'étaient pas reconnus lors du linkage).

    Citation Envoyé par Bousk Voir le message
    Le code prend un const& et en fait une copie interne.
    Je pense que ton problème vient d'ailleurs et tu as juste de la chance de pouvoir le repro en utilisant une variable locale.
    Le debugger sera certainement plus utile.
    Sans doute, c'est bien pour ça que je viens ici parce que j'ai plus d'idées :/.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur Etudes
    Inscrit en
    Juillet 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Etudes

    Informations forums :
    Inscription : Juillet 2010
    Messages : 54
    Par défaut
    Bonjour,

    juste pour dire qu'il fallait que je remette l'abi à 0 pour que ça marche...et surtout que je compile les sources moi même, en choisissant notamment de pas utiliser les sources pour lecture des hdf5...parfois effectivement, il faut compiler soi même la bibliothèque externe.

    Du coup c'est résolu.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/12/2011, 08h46
  2. Cacher Variable Url avec Variable Globale
    Par danuz dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/09/2003, 17h20
  3. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22
  4. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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