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 :

initialisation de tableaux


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut initialisation de tableaux
    Bonjour à tous,

    Pourriez vous m'expliquer s'il vous plaît pourquoi cette initialisation de tableau ne fonctionne pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int size = 10;
    double array[size] = {0.};

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Bonjour

    "Ne fonctionne pas" n'est pas un message d'erreur valide retourné par un compilateur C++. Quand on a une erreur, il faut la donner

    Sinon, il y a 2 choses qui me gène dans ton code :
    * un tableau style-C prend une taille constante. Utilise std::vector si tu veux une taille variable (et utilise std::array si c'est supporté par ton compilateur) ;
    * il manque un point-virgule à la fin de la seconde ligne ;
    * perso, j'aime pas la notion des réels de cette façon : "0.", je préfère ajouter au moins 1 décimale (il est facile de louper le point) "0.0"

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Voici ce que le compilateur me fournit comme message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    erreur: variable-sized object ‘array’ may not be initialized
    Cependant il me semble qu'un tableau style-C peut prendre une taille variable comme argument en C++. C'est aussi possible en C mais ça dépend du compilateur.
    Je suppose que l'erreur, de fait, ne se situe pas à ce niveau mais à l'initialisation.
    Vu que cela est possible en C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int size = 10;
    double array[size];
    ça m'intrigue qu'on ne puisse pas initialiser un tableau comme je l'ai fait dans mon post précédent.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Quel compilo utilises-tu, avec quel option de standard?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    j'utilise g++ avec les options suivantes :
    -Wall -Wextra -Wfatal-errors -Wredundant-decls -Wunreachable-code -g -pg

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Essaie avec -std=c++03 (le standard choisi par défaut par g++ est gnu++03)

  7. #7
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    La taille d'un tableau doit être constante.

    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int size = 10;
    std::vector<double> v(size, 0);
    La bibliothèque standard offre une classe pour utiliser des tableaux dynamiques : std::vector<T>.
    http://www.cplusplus.com/reference/vector/

    Bref, tout était dit par gbdivers...

  8. #8
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Alors, j'ai été étonné aussi, le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int size = 10;
    double array[size];
    ne produit pas d'erreurs quand j'ai testé sur ideone. Encore une idée reçue de ma part sur les tableaux style-C ?

    J'ai regardé la norme, c'est clair et net : il faut une expression constante :
    Citation Envoyé par Norme C++ - 8.3.4
    D1 [constant-expressionopt] attribute-specifier-seqopt
    Donc c'est gcc qui est trop gentil, il arrive à prendre la variable non constante pour créer un tableau de taille constante. Du coup, ça coince si on essaie d'initialiser.

    Tout va beaucoup mieux si on ajoute l'option de compilation -pedantic, on a un warning qui va bien :
    Citation Envoyé par gcc
    avertissement : ISO C++ forbids variable length array 'array' [-Wvla]
    On ajoute -Werror et tout est parfait ! Gcc nous insulte et refuse de compiler, comme il se doit

    @takout
    Moralité : même si c'est accepté par le compilateur, ajoute -pedantic -Werror et fait du code respectueux de la norme. Ça coûte rien, ça te permet d'apprendre de bonnes habitudes et ton code sera portable

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ah, j'avais pensé au -std=, mais pas au -pedantic.
    En tout cas ça confirme ce que je pensais: Le problème n'était pas que l'initialisation ne marchait pas, mais que g++ autorisait des VLA en C++.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Points : 95
    Points
    95
    Par défaut
    Je vous remercie pour votre aide.

    J'ai aussi remarqué que l'on ne pouvait pas faire de cast pour résoudre se problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int n =10;
    const int size = n;
    double array[size];

  11. #11
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 131
    Points : 33 074
    Points
    33 074
    Billets dans le blog
    4
    Par défaut
    J'avais aussi dit ça et on m'avait indiqué les variable length array.
    Après quant à en utiliser vraiment, je reste sceptique.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous,

    Je viens me coller à ce sujet parce que ma question est dans le même thème.

    Je débute en c++, j'ai sans doute plein de lacunes sur la rigueur de programmation, mais je me soigne. Le c++ de ce point de vue ne laisse pas passer grand chose. Je veux faire du c++ pour du calcul scientifique. Je suis arrivé à la programmation par matlab, puis python/scipy et maintenant c++ (et toujours python pour les graphes).

    Je suis scrupuleusement le bouquin "A First Course in Computational Physics and Object-Oriented Programming with c++" de David Yevick.

    L'auteur compile avec Borland sous windows, moi je suis sous linux avec g++ 4.6, donc il y a quelques nuances, mais j'arrive à m'en sortir. Là il y a une chose par contre que je ne comprends pas, voici le truc qui coince (codes résumés) :

    Dans le bouquin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    const int A = 10;
    const int B = 2;
    ...
    const int C = float(A) / B
    ...
    float D[C] = {0};
    ...
    Je suis habitué à initialiser mes tableaux avec des const, il précise bien que dans la définition de C, toutes les variables de l'expression doivent être des const aussi. Sauf que moi, quand je compile, j'ai la fameuse erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable-sized object 'D' may not be initialized
    Alors que je n'ai pas d'erreur pour la définition de C et A et B sont bien des const. Et, chose troublante, si j'écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    const int A = 10;
    const int B = 2;
    ...
    const int C = A / B
    ...
    float D[C] = {0};
    ...
    Là ça marche... Comme si le changement de statut de C venait du float appliqué à A par l'auteur (je suppose pour qu'il n'y ait pas d'erreur de division de 2 entiers.

    Le bouquin est un peu ancien, sans doute certaines choses ont changé dans les compilateurs ou je ne sais quoi.

    Qu'est-ce que vous en dites ?

    midel

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Je ne suis pas très au courant sur comment interagissent la notion de constante connue à la compilation (compile-time constant) et les nombres à virgule flottante, mais je ne suis qu'à moitié étonné que la virgule flottante "révoque" la constance de l'expression.

    Par exemple, les nombres à virgule flottante ne sont pas acceptés comme paramètre template: Un tel code génère une erreur "'float' is not a valid type for a template non-type parameter"
    Code C++ faux : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template< float F >
    class Toto
    {
    public:
    	float get() { return F; }
    };

    Et ce code-ci provoque une autre erreur, qui disparaît quand on utilise un cast explicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template< int I >
    class Toto
    {
    public:
    	int get() { return I; }
    };
     
    int main(void)
    {
    	//error: conversion from 'double' to 'int' not considered for non-type template argument
    	// error: could not convert template argument '5.0e+0' to 'int'
    	Toto< (10.0 / 2.0) > obj;
    	return 0;
    }

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Ok, donc ça ne te surprend pas. J'imagine que certains compilateurs sont plus ou moins souples concernant ce point précis, ce qui expliquerait que ça ne marche pas pour moi mais que ça marche pour l'auteur. Ou alors c'est une coquille

    Merci Médinoc !

    P.S. : je vais faire quelques essais de manipulations de constantes et d'utilisation de flottants, pour voir ce que ça donne.

Discussions similaires

  1. [CR 9] Initialisation de tableaux avec l'ensemble des enregistrement
    Par linger dans le forum Formules
    Réponses: 8
    Dernier message: 18/06/2009, 21h23
  2. De l'initialisation des tableaux dynamiques de Record
    Par metanil dans le forum Langage
    Réponses: 13
    Dernier message: 03/01/2008, 17h54
  3. initialisation de tableaux et recupération d'un element
    Par crazykangourou dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 24/10/2007, 15h23
  4. [debutant] declaration et initialisation de tableaux
    Par harsh dans le forum Débuter
    Réponses: 12
    Dernier message: 19/03/2005, 00h39
  5. Initialisation de tableaux
    Par bradley vier dans le forum C++
    Réponses: 11
    Dernier message: 02/03/2005, 14h53

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