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.};
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.};
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"
Voici ce que le compilateur me fournit comme message d'erreur.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2erreur: variable-sized object array may not be initialized
Je suppose que l'erreur, de fait, ne se situe pas à ce niveau mais à l'initialisation.
Vu que cela est possible en C++ :
ça m'intrigue qu'on ne puisse pas initialiser un tableau comme je l'ai fait dans mon post précédent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int size = 10; double array[size];
Quel compilo utilises-tu, avec quel option de standard?
j'utilise g++ avec les options suivantes :
-Wall -Wextra -Wfatal-errors -Wredundant-decls -Wunreachable-code -g -pg
Essaie avec -std=c++03 (le standard choisi par défaut par g++ est gnu++03)
La taille d'un tableau doit être constante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part int const size = 10;
Ou
La bibliothèque standard offre une classe pour utiliser des tableaux dynamiques : std::vector<T>.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int size = 10; std::vector<double> v(size, 0);
http://www.cplusplus.com/reference/vector/
Bref, tout était dit par gbdivers...
Alors, j'ai été étonné aussi, le code
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int size = 10; double array[size];
J'ai regardé la norme, c'est clair et net : il faut une expression constante :
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.Envoyé par Norme C++ - 8.3.4
Tout va beaucoup mieux si on ajoute l'option de compilation -pedantic, on a un warning qui va bien :
On ajoute -Werror et tout est parfait ! Gcc nous insulte et refuse de compiler, comme il se doitEnvoyé par gcc
@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
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++.
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];
J'avais aussi dit ça et on m'avait indiqué les variable length array.
Après quant à en utiliser vraiment, je reste sceptique.
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 :
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
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}; ...
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 variable-sized object 'D' may not be initialized
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.
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}; ...
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
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; }
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager