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 :

Tableau static, sizeof et taille déterminée à la compilation


Sujet :

Langage C++

  1. #41
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Ok. Bah je sais pas quel compilo et quelle version de C++ tu utilises, parce que là non seulement ton code n'est syntaxiquement pas correct, mais en plus ça n'est pas censé linker.

  2. #42
    Invité
    Invité(e)
    Par défaut
    Mais je trouves que tu devrais plutôt faire comme ça :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // header.h
    #ifndef TOTO
    #define TOTO 
    int a; 
    #endif

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // a.h
    #include "header.h"

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //a.cpp
    #include "a.h"

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //b.h
    #include "a.h"

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //b.cpp
    #include "b.h"

    Moi je fais comme ça est ça fonctionne.

  3. #43
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    J'ai vraiment pas envie de te vexer, mais non.
    Teste ton code, le link va échouer.
    Mais bon, vu que tu n'en fais qu'à ta tête, je sais très bien que tu ne le feras pas, donc tant pis pour toi, ça aurait été une occasion pour toi de comprendre la compilation et le linkage.

    Au passage, il sert à quoi a.h ? Pourquoi b.h ? Pourquoi b.h inclut a.h ?

  4. #44
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Clairement, Lolilolight, tu ne sais pas ce qu'est l'édition de liens (le linkage), ni une unité de compilation.
    Va lire un petit cours sur le sujet, ça te fera du bien. On en a plusieurs sur le site.

    Ton code n'ayant même pas de main, il ne risque pas d'être lié, vu que tu va au mieux te manger un "missing symbol int main()".

    Par ailleurs, tu as conscience que des gens qui ont plusieurs points par message et plus de message que toi ont probablement plus d'expertise que toi?

    PS: c'est la dernière fois que je te réponds dans ce sujet, nous n'avons pas à faire montre de colère, et je risque d'y tomber.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #45
    Invité
    Invité(e)
    Par défaut
    Car dans a.cpp tu auras ainsi la définition du header dans la même unité de compilation. (et non plus dans 2 unités de compilation différentes)
    Vu que a.cpp va include a.h qui lui même va include b.h qui va inclure ton header.

  6. #46
    Invité
    Invité(e)
    Par défaut
    Oui bon tant pis je laisse béton, je vois pas du tout ou se situe le problème et je ne vois aucun intérêt à vouloir faire ça, pour moi il y a moyen de faire ça simplement et je trouve que vous compliquer le problème inutilement, je vais pas tourner autour du pot plus longtemps. (Suffit juste de chercher un peu)
    Et non je n'ai pas mit de main, mais ça il suffit d'en rajouter un.

    Le sytème de point je m'en passerai, quand t'a fais du c++ pendant plus de 5 ans t'a pas besoin de points. (C'est un système pour les gamins ça qui s'amusent à te retirer des points par plaisir comme j'ai tant vu sur les forums sans même comprendre le problème)

  7. #47
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    Car dans a.cpp tu auras ainsi la définition du header dans la même unité de compilation. (et non plus dans 2 unités de compilation différentes)
    Vu que a.cpp va include a.h qui lui même va include b.h qui va inclure ton header.
    Ah bon. En lisant le code j'aurais plutôt dit a.cpp inclut a.h qui inclut header.h. Peu importe.
    J'ai beau retourner ta première phrase dans tous les sens, soit je la comprends pas, soit j'en comprends que t'as compris ni le système d'inclusion, ni la compilation, ni l'édition de liens.

    Citation Envoyé par leternel Voir le message
    PS: c'est la dernière fois que je te réponds dans ce sujet, nous n'avons pas à faire montre de colère, et je risque d'y tomber.
    Idem ici.

    Parle donc à un mur, tu verras quel effet ça fait.
    Je te rappelle quand même qu'on est pas les premiers à t'en faire la remarque. Si tu veux te mettre à dos ceux à qui tu demandes de l'aide (ou à qui tu la proposes), t'es sur le bon chemin.

  8. #48
    Invité
    Invité(e)
    Par défaut
    Ok je stop la discussion ici, mais merci de ne plus vouloir m'aider ou bien de poster des solutions sans comprendre vraiment le problème, car, ça aussi ça m'énerve. (Maintenant retirer moi des points hein, je m'en fou, vous voyez bien que moi je le fais pas pour vous donc là on vois bien la reconnaissance)
    Dernière modification par LittleWhite ; 11/09/2014 à 17h37. Motif: Lien non pérenne vers des tutoriels un peu trop vieux

  9. #49
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si j'ai bien compris, le problème est que la conséquence de simplement définir les variables (tableau et taille) dans un fichier source particulier, et les déclarer dans un header, cette conséquence étant que la taille n'est pas une constante connue à la compilation mais est seulement connue à l'édition de liens, semble considérée ici comme une conséquence inacceptable.

    Probablement parce que la problématique inclut l'utilisation de la taille dans des contextes qui nécessitent une constante connue à la compilation (tableaux, templates, switch/case...)
    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.

  10. #50
    Invité
    Invité(e)
    Par défaut
    En même temps pourquoi vouloir utiliser un tableau si on ne connaît pas la taille en compilation (mais que à l'édition des liens) ?

    Ca n'a pas de sens, autant utiliser un std::vector dans se cas là.

  11. #51
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si l'on n'a pas accès à C++11, utiliser un tableau est le seul moyen d'avoir quelque chose qui s'initialise "statiquement" (par manque d'un meilleur mot) vu qu'il faut C++11 pour utiliser la syntaxe {} sur les vecteurs.
    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.

  12. #52
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ca, ce n'est pas vrai, il y a boost:initializer qui le permet.
    Ou ma petite solution inspirée, mais qui requiert une copie de vecteur.

    Il "suffit" de créer un opérateur qui fait un push_back avec chainage.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #53
    Invité
    Invité(e)
    Par défaut
    Bon j'ai essayé ce code et il fonctionne, pas besoin de boost::initializer et companie.
    Ca m'affiche bien 3 dans le main, qui est la taille du tableau.
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef TEST_HPP
    #define TEST_HPP
    struct Test {
        static const char* tab;
        static const int size;
    };
    static const char t[] = {'a', 'b', 'c'};
    const char* Test::tab = t;
    const int Test::size = sizeof(t);
    #endif

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "test.hpp"
    #include <iostream>
    int main (int argv, char* argc) {
        std::cout<<Test::size<<std::endl;
    }

    C'est bien ça que tu voulais avoir, ça m'a prit même pas 2 minutes pour trouver le lien.

    PS : il y a moyen de faire mieux je pense en virant la variable globale et en appelant une méthode statique qui initialise le tableau.

  14. #54
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça linke, ça, quand tu as plusieurs fichiers source?
    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.

  15. #55
    Invité
    Invité(e)
    Par défaut
    Non, mais bon rien ne t'empêche de l'initialiser dans une unité de compilation à part :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //test.h
    #ifndef TEST_HPP
    #define TEST_HPP
    struct Test {
     
        static const char* tab;
        static const int size;
    };
    #endif

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //test.cpp
    #include "test.hpp"
    static const char t[] = {'a', 'b', 'c'};
    const char* Test::tab = t;
    const int Test::size = sizeof(t);

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //main.cpp
    #include "test.hpp"
    #include <iostream>
    int main () {
        std::cout<<Test::size<<std::endl;
    }

    L'initialiser dans une seule unité de compilation est suffisant! (Le faire dans plusieurs donne une erreur de linkage)
    Donc soit tu l'initialise dans le fichier test.cpp ou bien dans le fichier main.cpp.

  16. #56
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est ce que j'ai proposé il y a longtemps.
    Et on en revient au problème que je cite: Le client veut utiliser Test::size dans un template, tableau ou switch, et ne peut pas.
    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.

  17. #57
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    [...]
    L'initialiser dans une seule unité de compilation est suffisant! (Le faire dans plusieurs donne une erreur de linkage)
    Donc soit tu l'initialise dans le fichier test.cpp ou bien dans le fichier main.cpp.
    Admettons. J'initialise dans test.cpp.
    Dans main.cpp, j'ai un template qui prend une taille en paramètre. Je veux lui passer la taille du tableau. Je fais comment ?

  18. #58
    Invité
    Invité(e)
    Par défaut
    Ha bon ???

    Code cpp : 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
     
    #ifndef TEST_HPP
    #define TEST_HPP
    #include <iostream>
    struct Test {
        static const char* tab;
        static const int size;
    };
    struct A {
        A() {
            switch(Test::size) {
                case 0 : std::cout<<"size : "<<Test::size<<std::endl; break;
                case 1 : std::cout<<"size : "<<Test::size<<std::endl; break;
                case 2 : std::cout<<"size : "<<Test::size<<std::endl; break;
                case 3 : std::cout<<"size : "<<Test::size<<std::endl; break;
            }
        }
    };
    #endif
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "test.hpp"
    static const char t[] = {'a', 'b', 'c'};
    const char* Test::tab = t;
    const int Test::size = sizeof(t);

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "test.hpp"
    #include <iostream>
    int main () {
        std::cout<<Test::size<<std::endl;
        A a;
    }

  19. #59
    Invité
    Invité(e)
    Par défaut
    Pour passer une constante entière à un template tu ne peux pas le faire directement (et même en c++11 il n'y a pas moyen de le faire, j'ai essayé de lire une constante entière dans un fichier ou encore retourner la taille d'un tableau et la mettre dans une constexpr pour la passé en paramètre template ça n'a pas marché.)

    La solution est d'utiliser un switch.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "test.hpp"
    #include <iostream>
    int main () {
        std::cout<<Test::size<<std::endl;
        switch(Test::size) {
            case 0 : {A<0> a;} break;
            case 1 : { A<1> a;} break;
            case 2 : { A<2> a;} break;
            case 3 : { A<3> a;} break;
            default : std::cout<<"invalid size!"<<std::endl;
        }
    }

  20. #60
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Medinoc
    Le client veut utiliser Test::size dans un template, tableau ou switch
    Citation Envoyé par Lolilolight
    switch(Test::size)
    Ou comment taper complètement à côté de la plaque...
    Dans un switch, ce sont les case qui exigent des constantes connues à la compilation...
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Tableau static
    Par raynox dans le forum C++
    Réponses: 15
    Dernier message: 27/04/2006, 08h22
  2. [Débutant(e)][embarqué] Base de données vs tableau static
    Par ludonantes dans le forum Collection et Stream
    Réponses: 16
    Dernier message: 15/02/2006, 20h42
  3. ouvrir une nouvelle fenêtre dans une taille déterminé
    Par lnikolanta dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/09/2005, 15h26
  4. [Tableau]comment connaitre la taille d'un tableau à 2 dimensions
    Par Kyti dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 22/04/2005, 10h27
  5. static const et taille de tableau
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 16h01

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