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 :

Déclaration d'un array


Sujet :

C++

  1. #1
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut Déclaration d'un array
    Bonjour à tous

    Voici le code que je voudrais que l'on regarde :

    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
    #include <iostream>
    #include <tr1/array>  /// On Mac
    ///#include <array>   /// On other system
     
    class une_classe {
    public:
    		une_classe(int a, int b):_x(a),_y(b){};
    		void foo();
     
    protected:	
    		const int _x,_y;
    };
     
    void une_classe::foo(){
    	std::cout << "bla" << std::endl;
    	//std::tr1::array<int, _x> vec; // <-----------
    }
     
    int main( int argc, char* argv[] ){
     
    	std::tr1::array<int, 10> a;
    	const int N(10);
    	std::tr1::array<int, N> b;
     
    	std::cout << "Hello world!" << std::endl;
    	une_classe obj(10,10);
    	obj.foo();
     
    	return 0;
    }
    Tel quel, le code compile bien.
    Dans le main on créer 2 arrays puis un objet de la classe que l'on a définie.
    La fonction foo() ne fait qu'afficher "bla".
    Si maintenant je veux faire qqch de plus avancé avec ma fonction foo(), admettons qu'à l'intérieur de cette méthode, j'ai besoin d'un array d'entier dont la taille serait l'attribut _x de mon objet.
    Je décommente la ligne mise en évidence dans cette fonction.
    Et là erreur :
    array.cpp:19:23: error: non-type template argument of type 'int' is not an integral constant expression
    std::tr1::array<int, _x> vec;
    ^~
    1 error generated.
    (edit: Le curseur ^~ pointe sur _x, mais les espaces multiples ne semblent pas être affichés correctement)

    J'ai essayé de rajouter un cast int-->size_t, mais visiblement il est effectué par défaut vu que le message d'erreur reste le même.
    Pourquoi est-ce que j'obtiens cette erreur?
    Comment puis-je m'en débarrasser?
    Je pourrais certes utiliser un std::vector au lieu d'un std::tr1::array mais le parcours et l'extraction sont plus coûteux non?

    Merci de votre aide

    lg_53

  2. #2
    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
    c'est parce qu'il faut une constante à la compilation, donc une constexpr pour le constructeur.

    un vector est un tableau en interne.
    Le surcout n'est pas dans l'indexation ou le parcours, mais dans le support des fonctionnalités d'ajout et suppression
    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

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Ah ok.
    Donc si je ne connais pas la dimension au moment de la compilation, je dois oublier les array c'est ça ?

    Je m'étais justement tourné vers des arrays car une fois alloué la taille de mes tableaux ne bougeront pas. Donc pas d'insertions, ni de suppressions d'éléments.

  4. #4
    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
    La taille d'une array est un argument de template, c'est utilisé par le compilateur pour générer la bonne classe.
    En l'occurence, array<int, 2> est une classe différente de array<int, 3> et de array<double, 2>Il y aura std::dynarray (un jour), en attendant, elle existe peut-être dans boost, sinon, tu peux la créer.

    Si c'est ton choix, tu peux plonger dans la STL de ton compilateur, regarder array et vector, et créer ta propre classe combinaison des deux.
    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. #5
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Bon ben je vais faire avec des std::vector, je pense, ça sera plus simple.

    Citation Envoyé par leternel Voir le message
    Si c'est ton choix, tu peux plonger dans la STL de ton compilateur, regarder array et vector, et créer ta propre classe combinaison des deux.
    Ca, ca sera pour plus tard, quand j'aurais le temps !

    Merci de votre aide, qui fut rapide.

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

Discussions similaires

  1. [C++] Problème de déclaration d'un vecteur array
    Par kanaziwok dans le forum C++
    Réponses: 5
    Dernier message: 07/05/2010, 15h34
  2. Raccourcis lors d'une déclaration d'un Array
    Par saigon dans le forum Ruby
    Réponses: 1
    Dernier message: 28/08/2009, 08h06
  3. Re-déclaration de array of TBitmap avec SetLength
    Par Pierre de Nice dans le forum Débuter
    Réponses: 6
    Dernier message: 06/07/2008, 08h02
  4. Déclaration de type array of array of variant
    Par Drooxy dans le forum Delphi
    Réponses: 4
    Dernier message: 14/12/2006, 19h25
  5. probleme lié à la déclaration de array
    Par eleve36 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 09/11/2005, 17h26

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