Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

déclaration tableau taille variable

30 réponses
Avatar
Nicolas Aunai
salut,


ayant a l'origine appris le C, j'apprend a présent le C++, et j'ai été
un peu "choqué" de voir que je pouvais faire une déclaration de tableau
ainsi :

int x;
cin>>x;
int tab[x];


je pensais, qu'il n'y avait que 4 méthodes pour déclarer un tableau :

#define MAX 20

int tab[MAX];

ou bien

int tab[20]

ou bien

const int x = 20;

int tab[x];

et enfin

int tab[]={2,3,4};


depuis quand la déclaration d'un tableau avec une variable non
constante est-elle autorisée en C++ ? n'est-ce pas un peu dangereux si
par exemple ma variable est mal "controlée" (ex : x=29299939391992991)

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

1 2 3
Avatar
Vincent Richard

int x;
cin>>x;
int tab[x];

[...]

depuis quand la déclaration d'un tableau avec une variable non
constante est-elle autorisée en C++ ?


C'est sûrement une extension de ton compilateur car ça ne semble pas être
autorisé par la norme. Avec g++, en mode ANSI strict :

[ tmp]$ cat tab.cpp
int main()
{
int x = 25;
int tab[x];
}
[ tmp]$ g++ -ansi -Wall -pedantic -o tab tab.cpp
tab.cpp: In function `int main()':
tab.cpp:4: warning: ISO C++ forbids variable-size array `tab'

Par contre, ça passe si on enlève les flags "-ansi ...".

n'est-ce pas un peu dangereux si par exemple ma variable est mal
"controlée" (ex : x)299939391992991)


Pas plus que :

int x = 2909879789789;
// [...]
int* monTab = new int[x];

ou bien :

int* b = 0;
// ...
*b = 1234;

etc...

En principe, ta variable ne devrait pas être "mal contrôlée". Ou bien je ne
comprends pas ce que tu entends par cette expression...

Un des avantages de C++, c'est quand même de nous laisser libre de faire ce
qu'on veut, même si c'est "dangereux". Au programmeur de faire attention, et
d'ajouter lui-même les tests s'il le veut. De cette façon, les personnes qui
n'ont pas besoin de ces tests ne sont pas pénalisées (notamment au niveau
des performances).

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
Fabien LE LEZ
On Mon, 17 Nov 2003 22:23:04 +0100, Nicolas Aunai
ç wrote:

ayant a l'origine appris le C, j'apprend a présent le C++, et j'ai été
un peu "choqué" de voir que je pouvais faire une déclaration de tableau
ainsi :

int x;
cin>>x;
int tab[x];


Ce n'est pas autorisé en C++ ; par contre il me semble que c'est
autorisé en C (sauf le 'cin' bien sûr).

On peut par contre écrire :

int x;
cin>>x;
std::vector<int> tab (x);

n'est-ce pas un peu dangereux si
par exemple ma variable est mal "controlée" (ex : x)299939391992991)


Y'a plein de trucs dangereux à faire en C++.
Le C++ est un langage pour "adultes" (pas de notion d'âge ici) : t'as
le droit de faire à peu près tout ce que tu veux, à toi de prendre tes
responsabilités et de faire un peu attention à ce que tu fais.

Au fait, tu travailles sur une machine 64 bits ?

--
;-)

Avatar
Marc Boyer
icolas Aunai wrote:
ayant a l'origine appris le C, j'apprend a présent le C++, et j'ai été
un peu "choqué" de voir que je pouvais faire une déclaration de tableau
ainsi :

int x;
cin>>x;
int tab[x];


C'est a ma connaissance une extension GNU (mais peut-être
d'autres compilateurs l'implémentent-ils aussi).

je pensais, qu'il n'y avait que 4 méthodes pour déclarer un tableau :

#define MAX 20
int tab[MAX];

ou bien

int tab[20]


Notons que ces deux premières versions sont équivalentes pour
le compilateur (après passage du préprocesseur, int tab[MAX]
devient littéralement int tab[20]).

const int x = 20;
int tab[x];


On peut aussi faire en C99
void foo(int x){
int tab[x];
}

mais c'est interdit en C++

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Nicolas Aunai
"Vincent Richard" a couché sur son écran :


En principe, ta variable ne devrait pas être "mal contrôlée". Ou bien je ne
comprends pas ce que tu entends par cette expression...



et bien par exemple, si on admet que le programmeur a pris TOUTES les
sécurités possibles et imaginables pour controler les valeurs prises
par x, il y a certains cas, par exemple dans des applications réseau,
où x pourrait prendres des valeurs farfelues et imprévisibles venues de
l'extérieur du programme... dans ces conditions, déclarer un tableau de
dimension x, inconnue donc, me parait assez dangereux.

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Nicolas Aunai
"Fabien LE LEZ" avait écrit le 17/11/2003 :


int x;
cin>>x;
int tab[x];


Ce n'est pas autorisé en C++ ; par contre il me semble que c'est
autorisé en C (sauf le 'cin' bien sûr).


en C99 oui, j'ai été très surpris de l'apprendre.

On peut par contre écrire :

int x;
cin>>x;
std::vector<int> tab (x);


oui ok, mais là vector s'occupe de la mémoire par derrière...

n'est-ce pas un peu dangereux si
par exemple ma variable est mal "controlée" (ex : x)299939391992991)



[...]


Au fait, tu travailles sur une machine 64 bits ?


non non, j'ai pas réfléchis la valeur de x...

--
Nico,
http://astrosurf.com/nicoastro
messenger :


Avatar
Nicolas Aunai
"Marc Boyer" a dit:


mais c'est interdit en C++


je n'arrive pas a trouver le passage le disant dans la norme

--
Nico,
http://astrosurf.com/nicoastro
messenger :

Avatar
Marc Boyer
Nicolas Aunai wrote:
"Marc Boyer" a dit:
mais c'est interdit en C++


je n'arrive pas a trouver le passage le disant dans la norme


Comme je n'ai pas la norme, je ne te donnerais pas plus
d'info sur le sujet mais
1) mon compilateur g++ a la gentillesse de me le signaler
(et je lui fais assez confiance sur ce coup là)
2) je crois tenir l'information de Gabriel, qui m'avait
repris sur le sujet

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Jean-Marc Bourguet
Nicolas Aunai ç writes:

"Marc Boyer" a dit:


mais c'est interdit en C++


je n'arrive pas a trouver le passage le disant dans la norme


5.19

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
DINH Viêt Hoà

const int x = 20;
int tab[x];



d'ailleurs ceci est-il autorisé en C90 ?

--
DINH V. Hoa,

"s/^((.|[^[]|[(^.|[^^])[^]]*])*)([^*[])/14/"
-- Stéphane CHAZELAS


Avatar
kanze
Jean-Marc Bourguet wrote in message
news:...
Nicolas Aunai ç writes:

"Marc Boyer" a dit:

mais c'est interdit en C++


je n'arrive pas a trouver le passage le disant dans la norme


5.19


Mais surtout §8.3.4.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



1 2 3