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++

  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 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 403
    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 167
    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 167
    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 !

  7. #7
    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
    Du nouveau : le problème se déclare également avec -Wsign_Compare : mais toujours lorsque j'utilise des templates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void f() {
        unsigned int n = 5;
        for(int i=0; i<n; i++){}
    }
     
    int main(){
     
        f();
        return 0;
    }
    compile. (1 warning -Wsign-compare)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename T>
    void f() {
        unsigned int n = 5;
        for(int i=0; i<n; i++){};
    }
     
    int main(){
     
        f<int>();
        return 0;
    }
    ne compile pas. (1 erreur required from here, warning -Wsign-compare )

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ben, tu dis que n est un "entier non signé", et tu essayes de le comparer ... à un entier (a priori signé) dans ta boucle for... ca risque de poser problèmes!

    Utilise un entier non signé dans ta boucle for, et tu aura la certitude que "tout se passera bien" (aussi bien à la compilation qu'à l'exécution )
    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

  9. #9
    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 koala01 Voir le message
    Salut,

    Ben, tu dis que n est un "entier non signé", et tu essayes de le comparer ... à un entier (a priori signé) dans ta boucle for... ca risque de poser problèmes!

    Utilise un entier non signé dans ta boucle for, et tu aura la certitude que "tout se passera bien" (aussi bien à la compilation qu'à l'exécution )
    Oui bien sûr tu as tout à fait raison ! c'est un conseil tout à fait avisé même .
    C'est un problème que je peux corriger (je l'ai d'ailleurs déjà fait depuis le temps où j'ai posté le premier message, en même temps que mon problème d'accolades), mais ça doit selon moi rester un warning. Que ce soit un warning d'un entier signé / non signé ou un autre peu importe, à terme je les corrige. Je ne comprends tout simplement pas pourquoi tous mes warnings deviennent des erreurs (dans mes fonction/classes templates du moins) ce qui foire carrément la compilation : je ne compile pas avec -Werror ! Du coup ça m'handicape dans mon debuggage car je ne peux pas prioriser les problèmes à corriger.

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, 11h52
  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, 09h47
  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, 13h39
  4. enregister un projet sous code Blocks
    Par rimbaut dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 09/04/2006, 22h20

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