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

Langage C++ Discussion :

Portage projet c++ code::block : "required from here" deviennent des erreurs + embêtements divers


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Par défaut Portage projet c++ code::block : "required from here" deviennent des erreurs + embêtements divers
    Salut à tous !

    J'essaye de porter un projet c++ 14 code::block et GCC depuis Windows vers linux. Le projet marchait très bien sur windows mais en passant par linux, patatras !
    OS de départ : Windows 7 Professional
    Compilateur : TDM GCC 5.1 (avec -std c++14)
    Code::Blocks : version 10.5 (je crois).

    OS d'arrivée : Ubuntu 12.04
    Compilateur : GCC 5.2.1 (avec -std c++14)
    Code::Blocks : version 10.5.2.

    J'ai réduit mon code à sa plus simple expression. Je suis censé avoir un warning du type -Wnarrowing :
    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
     
    #include<vector>
     
    template<typename T>
    struct Array {
        std::vector<long> shape;
     
        Array(const std::vector<T> & data) : shape({data.size()}) {} // <-- -Wnarrowing ici
    };
     
    int main(){
     
     
      Array<long> a({1L,2L,3L,4L,5L});
     
      return 0;
    };
    Or j'obtiens le log suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -------------- Build: Debug in APL ---------------
    
    Compiling: main.cpp
    /home/tchebychev/APL/main.cpp: In instantiation of ‘Array<T>::Array(const std::vector<T>&) [with T = long int]’:
    /home/tchebychev/APL/main.cpp:13:33:   required from here
    /home/tchebychev/APL/main.cpp:7:61: warning: narrowing conversion of ‘(& data)->std::vector<_Tp, _Alloc>::size<long int, std::allocator<long int> >()’ from ‘std::vector<long int>::size_type {aka unsigned int}’ to ‘long int’ inside { } [-Wnarrowing]
         Array(const std::vector<T> & data) : shape({data.size()}) {} // Given data only : assuming 1-D vector
                                                                 ^
    /home/tchebychev/APL/main.cpp:7:61: warning: narrowing conversion of ‘(& data)->std::vector<_Tp, _Alloc>::size<long int, std::allocator<long int> >()’ from ‘std::vector<long int>::size_type {aka unsigned int}’ to ‘long int’ inside { } [-Wnarrowing]
    Linking console executable: bin/Debug/APL
    Output size is 41,04 KB
    Process terminated with status 0 (0 minutes, 0 seconds)
    1 errors, 2 warnings
    J'obtiens bien le warning (en double : je ne sais pas pourquoi) mais en plus le required from here qui indique l'appel dans le main devient une erreur !? Et du coup ça ne compile pas

    Notes :
    • Si le warning est levé dans le main, tout baigne. Exemple : le code suivant compile :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      #include<vector>
       
      int main(){
       
       
        std::vector<long> a({1L,2L,3L,4L,5L});
        std::vector<long> b({a.size()}); // <-- -Wnarrowing ici (encore en double et je ne sais toujours pas pourquoi)
        return 0;
      };
      (En faisant un rebuild, car si je fais build and run, j'ai un autre problème : le build du log s'efface à l'exécution )
    • Je compile sans flag à part le std=c++14 rajouté dans other options (enfin je crois : j'ai décoché toutes les cases dans compiler settings., contrairement à Windows le log n'affiche pas la commande complète au début du log : C'était pourtant bien pratique ).
      Mettre std=c++11 génère la même erreur. Par contre, si je rajoute -w pour taire les warnings, là ça marche.


    Auriez-vous des idées ? Pensez-vous que c'est lié à Code::blocks ? ou à GCC ? ou bien à moi ce qui est probable aussi !

    Bon week-end !

    Jean

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    On dirait qu'il considère l'expression data.size() comme la fonction membre elle-même plutôt que sa valeur de retour (un genre de most vexing parse, quoi).

    Je ne connais pas très bien C++11, mais quand on utilise l'initialisation par accolades, ces parenthèses sont-elles pertinentes?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Array(const std::vector<T> & data) : shape({data.size()}) {}
    std::vector<long> b({a.size()});
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    On dirait qu'il considère l'expression data.size() comme la fonction membre elle-même plutôt que sa valeur de retour (un genre de most vexing parse, quoi).

    Je ne connais pas très bien C++11, mais quand on utilise l'initialisation par accolades, ces parenthèses sont-elles pertinentes?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Array(const std::vector<T> & data) : shape({data.size()}) {}
    std::vector<long> b({a.size()});
    Merci Médinoc pour ta réponse.

    Je peux en effet enlever es parenthèses autour de {data.size} dans la liste d'initialisation, mais pas autour de {a.size dans le main}.

    Je crois qu'en C++11 et au delà l'écriture équivalente à Truc truc({bidule}) est Truc truc = {{bidule}} mais ce n'est pas équivalent à Truc truc{bidule} ni a Truc truc = {bidule}.
    Je manque de connaissance dans ce sujet mais je crois que j'ai défini le constructeur qui permet de faire Truc truc({bidule}) (avec cast implicite de la liste d'initialisation en std::vector) mais pas celui qui permet de faire Truc truc{bidule}. Je crois que std::vector dispose de tous les constructeurs qu'il faut pour accepter tous le types de notation.

    Après, c'est vrai que j'ai toujours fait ça à l'estime et jai retenu la solution qui marchait sans plus me poser de question . J'invite maintenant tout expert >= C++11 à démonter mon interprétation .

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Par défaut
    Je penche en effet pour le most vexing parse...
    • En passant l'initialisation de shape dans le corps de la fonction, ça marche.


    Mais alors pourquoi ce log bizarre qui n'explicite même pas l'erreur ? Note: quand je remplace le long par des unsigned long ça compile.
    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
    #include<vector>
     
    template<typename T>
    struct Array {
        std::vector<unsigned long> shape;
     
        Array(const std::vector<T> & data) : shape({data.size()}) {} // <-- -Wnarrowing ici
    };
     
    int main(){
     
     
      Array<long> a({1L,2L,3L,4L,5L});
     
      return 0;
    };
    L'erreur semble quand même avoir un lien avec le -Wnarrowing. Help ! j'y comprends plus rien !

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    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 153
    Billets dans le blog
    4
    Par défaut
    Ce serait pas qu'il sait pas quoi choisir entre l'initialisation de la taille du vecteur et l'initialisation par initialize-list avec 1 entier ?
    Cette nouvelle syntaxe {}, je suis vraiment pas partisan de l'utiliser par défaut, pour des cas comme celui-là justement.
    D'ailleurs je comprends pas bien ta syntaxe ou tu cumules ( et {
    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 géomaticien
    Inscrit en
    Juillet 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur géomaticien

    Informations forums :
    Inscription : Juillet 2015
    Messages : 34
    Par défaut
    Merci Bousk.

    Je combinais justement ( et { car je pensais que shape({data.size()}) était équivalent à shape = {data.size}, mais que la première notation me permettait de mettre ça dans la liste d'initialisation.
    Tu as raison c'est sans doute trop ambigu donc le compilateur est perdu. Je vais faire une initialisation propre dans le corps du constructeur et voir en rétablissant tout mon main si c'est le seul problème.

    Je m'interroge toujours sur la signification du log par contre, pourquoi une erreur sur le required from here ?
    Vous avez des idées pour :
    • le build du log s'efface à l'exécution ?
    • comment afficher la commande gcc utilisée dans code::blocks ?


    Merci beaucoup !

Discussions similaires

  1. code::block en mode debug: lecture du contenu des vectors
    Par membreComplexe12 dans le forum C++
    Réponses: 7
    Dernier message: 03/05/2011, 10h52
  2. Code::Blocks ne veut pas build un projet qui a été fermé
    Par Shugo78 dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 09/05/2007, 08h47
  3. [Linker dans le projet .cbp Code::Blocks]GTKmm
    Par Jean_Benoit dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 04/10/2006, 12h39
  4. enregister un projet sous code Blocks
    Par rimbaut dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 09/04/2006, 21h20

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