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

initialiser un tableau conditionnellement

12 réponses
Avatar
Xavier
Bonjour,

J'ai besoin de conseils sur la meilleure facon d'initialiser un tableau au
sein d'une structure if...
J'utilise différents tableaux avec des valeurs définies (dates d'echéanier,
valeur de tranches...) et je pensais les initialier ainsi (adEch contient
ici par exemple différentes dates d'échéance):

if (bMens)
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
else
double adEch[] = {15.03, 15.06};

cout << adEch[0] <<endl;

Seulement je ne peux accéder aux tableaux ensuite vu que adEch est déclaré
et initialisé au sein de l'expression conditionelle (error C2065: adEch non
déclaré). La solution serait éventuellement de déclarer un tableau adTmp[]
avant et de copier au sein des conditions ces tableaux mais vu que la taille
des tableaux initialisé n'est pas toujours la même ce n'est pas si simple...
Comment faite vous pour initialiser rapidement des tableaux dans ce cas ?
Auriez vous quelques idées...
Merci
Xavier

10 réponses

1 2
Avatar
Michel Decima
Bonjour,

J'ai besoin de conseils sur la meilleure facon d'initialiser un tableau au
sein d'une structure if...
J'utilise différents tableaux avec des valeurs définies (dates d'echéanier,
valeur de tranches...) et je pensais les initialier ainsi (adEch contient
ici par exemple différentes dates d'échéance):

if (bMens)
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
else
double adEch[] = {15.03, 15.06};

cout << adEch[0] <<endl;

Seulement je ne peux accéder aux tableaux ensuite vu que adEch est déclaré
et initialisé au sein de l'expression conditionelle (error C2065: adEch non
déclaré). La solution serait éventuellement de déclarer un tableau adTmp[]
avant et de copier au sein des conditions ces tableaux mais vu que la taille
des tableaux initialisé n'est pas toujours la même ce n'est pas si simple...
Comment faite vous pour initialiser rapidement des tableaux dans ce cas ?
Auriez vous quelques idées...


Pourquoi ne pas utiliser un std::vector< double > ?

Avatar
Xavier
En fait j'utilise un vector par la suite (vector<double> vEch(adEch, adEch+
sizeof(adEch)/sizeof(*adEch))). Mais je souhaitais utiliser le tableau au
départ pour initialiser facilement les valeurs de ce tableau. Sauf erreur il
n'est pas possible d'initialiser facilement les valeurs d'un vecteur comme
15.01, 15.02, 15.03, 15.04, 15.05, 15.05 . Et la j'ai un probleme parce que
ma déclaration + initialisation de tableau n'est pas connu en dehors de
l'expression If...
Merci de développer si tu pensais a quelque chose de précis...
Xavier

"Michel Decima" a écrit dans le message de
news: eu0mon$6m4$
Bonjour,

J'ai besoin de conseils sur la meilleure facon d'initialiser un tableau
au sein d'une structure if...
J'utilise différents tableaux avec des valeurs définies (dates
d'echéanier, valeur de tranches...) et je pensais les initialier ainsi
(adEch contient ici par exemple différentes dates d'échéance):

if (bMens)
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
else
double adEch[] = {15.03, 15.06};

cout << adEch[0] <<endl;

Seulement je ne peux accéder aux tableaux ensuite vu que adEch est
déclaré et initialisé au sein de l'expression conditionelle (error C2065:
adEch non déclaré). La solution serait éventuellement de déclarer un
tableau adTmp[] avant et de copier au sein des conditions ces tableaux
mais vu que la taille des tableaux initialisé n'est pas toujours la même
ce n'est pas si simple...
Comment faite vous pour initialiser rapidement des tableaux dans ce cas ?
Auriez vous quelques idées...


Pourquoi ne pas utiliser un std::vector< double > ?



Avatar
Sylvain Togni
Xavier wrote:

En fait j'utilise un vector par la suite (vector<double> vEch(adEch, adEch+
sizeof(adEch)/sizeof(*adEch))). Mais je souhaitais utiliser le tableau au
départ pour initialiser facilement les valeurs de ce tableau. Sauf erreur il
n'est pas possible d'initialiser facilement les valeurs d'un vecteur comme
15.01, 15.02, 15.03, 15.04, 15.05, 15.05 . Et la j'ai un probleme parce que
ma déclaration + initialisation de tableau n'est pas connu en dehors de
l'expression If...


Tu peux faire soit :

vector<double> vEch;
if (bMens) {
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vEch.assign(adEch, adEch+sizeof(adEch)/sizeof(*adEch));
}
else {
double adEch[] = {15.03, 15.06};
vEch.assign(adEch, adEch+sizeof(adEch)/sizeof(*adEch));
}

soit :

vector<double> vEch;
if (bMens) {
vEch.push_back(15.01);
vEch.push_back(15.02);
...
}
else {
vEch.push_back(15.03);
vEch.push_back(15.06);
}

--
Sylvain Togni

Avatar
Xavier
Finalement je vais partir sur un truc comme cela en passant par la
construction suivante..
std::vector<double> vEch;
if (bMens){
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vector<double> vEchTmp(adEch, adEch + sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
else {
double adEch[] = {15.01, 15.05};
vector<double> vEchTmp(adEch, adEch + sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
Mais je trouve cela plutot lourd.
Reste une question : Pourquoi si je déclare une variable au sein d'un if
else, celle ci n'est pas accessible apres (c'est possible en VB mais pas en
C++; ou est ce une question de reglage du compilateur?)
Et un regret: Dommage que la STL ne propose par un constructeur pour
initialiser un vecteur de la sorte:
std::vector<double> vEch (15.01, 15.02, 15.03, 15.04, 15.05, 15.05);!!!
Xavier



"Xavier" a écrit dans le message de news:
4603ecd9$0$27387$
En fait j'utilise un vector par la suite (vector<double> vEch(adEch,
adEch+ sizeof(adEch)/sizeof(*adEch))). Mais je souhaitais utiliser le
tableau au départ pour initialiser facilement les valeurs de ce tableau.
Sauf erreur il n'est pas possible d'initialiser facilement les valeurs
d'un vecteur comme 15.01, 15.02, 15.03, 15.04, 15.05, 15.05 . Et la j'ai
un probleme parce que ma déclaration + initialisation de tableau n'est pas
connu en dehors de l'expression If...
Merci de développer si tu pensais a quelque chose de précis...
Xavier

"Michel Decima" a écrit dans le message de
news: eu0mon$6m4$
Bonjour,

J'ai besoin de conseils sur la meilleure facon d'initialiser un tableau
au sein d'une structure if...
J'utilise différents tableaux avec des valeurs définies (dates
d'echéanier, valeur de tranches...) et je pensais les initialier ainsi
(adEch contient ici par exemple différentes dates d'échéance):

if (bMens)
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
else
double adEch[] = {15.03, 15.06};

cout << adEch[0] <<endl;

Seulement je ne peux accéder aux tableaux ensuite vu que adEch est
déclaré et initialisé au sein de l'expression conditionelle (error
C2065: adEch non déclaré). La solution serait éventuellement de déclarer
un tableau adTmp[] avant et de copier au sein des conditions ces
tableaux mais vu que la taille des tableaux initialisé n'est pas
toujours la même ce n'est pas si simple...
Comment faite vous pour initialiser rapidement des tableaux dans ce cas
? Auriez vous quelques idées...


Pourquoi ne pas utiliser un std::vector< double > ?







Avatar
Xavier
Merci sylvain,
Nos mails viennent de se croiser mais je ne connaissais pas vraiment assign
comme cela. Du coup ca me retire une ligne..
Xavier

"Sylvain Togni" <"sylvain.togni at visionobjects.com"> a écrit dans le
message de news: 4603f33c$0$21146$
Xavier wrote:

En fait j'utilise un vector par la suite (vector<double> vEch(adEch,
adEch+ sizeof(adEch)/sizeof(*adEch))). Mais je souhaitais utiliser le
tableau au départ pour initialiser facilement les valeurs de ce tableau.
Sauf erreur il n'est pas possible d'initialiser facilement les valeurs
d'un vecteur comme 15.01, 15.02, 15.03, 15.04, 15.05, 15.05 . Et la j'ai
un probleme parce que ma déclaration + initialisation de tableau n'est
pas connu en dehors de l'expression If...


Tu peux faire soit :

vector<double> vEch;
if (bMens) {
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vEch.assign(adEch, adEch+sizeof(adEch)/sizeof(*adEch));
}
else {
double adEch[] = {15.03, 15.06};
vEch.assign(adEch, adEch+sizeof(adEch)/sizeof(*adEch));
}

soit :

vector<double> vEch;
if (bMens) {
vEch.push_back(15.01);
vEch.push_back(15.02);
...
}
else {
vEch.push_back(15.03);
vEch.push_back(15.06);
}

--
Sylvain Togni



Avatar
JBB
Finalement je vais partir sur un truc comme cela en passant par la
construction suivante..
std::vector<double> vEch;
if (bMens){
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vector<double> vEchTmp(adEch, adEch + sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
else {
double adEch[] = {15.01, 15.05};
vector<double> vEchTmp(adEch, adEch + sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
Mais je trouve cela plutot lourd.
Reste une question : Pourquoi si je déclare une variable au sein d'un if
else, celle ci n'est pas accessible apres (c'est possible en VB mais pas en
C++; ou est ce une question de reglage du compilateur?)
Parceque le C++ est compilé, alors que le if n'est évalué que lors de

l'éxectution.

Qu'est ce qui se passerait si je faisais:
if (truc)
{
int i =1;
}
utiliser(i);

Quand truc est faux, i n'existe pas et donc utiliser(i) ne devrait pas
compiler !!???

tu est obligé de faire:
int i =0;
if (truc) i = 1;
Tu as un probleme supplementaire car tes 2 tableaux n'ont pas la même
empreinte en RAM.

Moi a ta place je ferais un truc du genre:
double adEch1[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
double adEch2[] = {15.01, 15.05};

std::vector<double> vEch;
if (bMens){
vEch = vector<double>(adEch,adEch + sizeof(adEch)/sizeof(*adEch));}
else {
vEch = vector<double>(adEch1,adEch1+sizeof(adEch1)/sizeof(*adEch1));}
}
Avec des plus jolis non que 1 ou 2

Et un regret: Dommage que la STL ne propose par un constructeur pour
initialiser un vecteur de la sorte:
std::vector<double> vEch (15.01, 15.02, 15.03, 15.04, 15.05, 15.05);!!!
Xavier





Avatar
JBB
Finalement je vais partir sur un truc comme cela en passant par la
construction suivante..
std::vector<double> vEch;
if (bMens){
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vector<double> vEchTmp(adEch, adEch + sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
else {
double adEch[] = {15.01, 15.05};
vector<double> vEchTmp(adEch, adEch + sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
Mais je trouve cela plutot lourd.
Reste une question : Pourquoi si je déclare une variable au sein d'un if
else, celle ci n'est pas accessible apres (c'est possible en VB mais pas en
C++; ou est ce une question de reglage du compilateur?)
Et un regret: Dommage que la STL ne propose par un constructeur pour
initialiser un vecteur de la sorte:
std::vector<double> vEch (15.01, 15.02, 15.03, 15.04, 15.05, 15.05);!!!
Xavier


Si ça t'amuse tu peux rajouter un operateur << à vector
( ou classe dérivée)
en très gros vector<TYPE> & operator << (TYPE)

et tu pourra faire
vEch << 5.0 << 1.2 << 63.5 << 4.2;

Avatar
Xavier
Merci pour ta réponse JB,

"JBB" a écrit dans le message de news:
eu12a9$9me$
Finalement je vais partir sur un truc comme cela en passant par la
construction suivante..
std::vector<double> vEch;
if (bMens){
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vector<double> vEchTmp(adEch, adEch +
sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
else {
double adEch[] = {15.01, 15.05};
vector<double> vEchTmp(adEch, adEch +
sizeof(adEch)/sizeof(*adEch));
vEch = vEchTmp;
}
Mais je trouve cela plutot lourd.
Reste une question : Pourquoi si je déclare une variable au sein d'un if
else, celle ci n'est pas accessible apres (c'est possible en VB mais pas
en C++; ou est ce une question de reglage du compilateur?)
Parceque le C++ est compilé, alors que le if n'est évalué que lors de

l'éxectution.

Qu'est ce qui se passerait si je faisais:
if (truc)
{
int i =1;
}
utiliser(i);

Quand truc est faux, i n'existe pas et donc utiliser(i) ne devrait pas
compiler !!???
C'est vrai mais dans l'idée une des hypotheses testé est forcément vrai a un

moment (dernier else par exemple) et dons i est tjrs déclaré (en VBA cela
marche mais c'est sans doute moins sécurisé)...

tu est obligé de faire:
int i =0;
if (truc) i = 1;
Tu as un probleme supplementaire car tes 2 tableaux n'ont pas la même
empreinte en RAM.

Moi a ta place je ferais un truc du genre:
double adEch1[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
double adEch2[] = {15.01, 15.05};

std::vector<double> vEch;
if (bMens){
vEch = vector<double>(adEch,adEch + sizeof(adEch)/sizeof(*adEch));}
else {
vEch = vector<double>(adEch1,adEch1+sizeof(adEch1)/sizeof(*adEch1));}
}
Avec des plus jolis non que 1 ou 2
J'aurais plutot tendance a déclarer les tableaux a l'interieur des test

conditionelle pour ne pas creer de tableaux s'ils ne sont pas utilisés
apres).

Et un regret: Dommage que la STL ne propose par un constructeur pour
initialiser un vecteur de la sorte:
std::vector<double> vEch (15.01, 15.02, 15.03, 15.04, 15.05, 15.05);!!!
Xavier






Avatar
Sylvain
Xavier wrote on 23/03/2007 13:59:

J'utilise différents tableaux avec des valeurs définies (dates d'echéanier,
valeur de tranches...) et je pensais les initialier ainsi (adEch contient
ici par exemple différentes dates d'échéance):

if (bMens)
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
else
double adEch[] = {15.03, 15.06};

cout << adEch[0] <<endl;

Seulement je ne peux accéder aux tableaux ensuite vu que adEch est déclaré
et initialisé au sein de l'expression conditionelle [...]


static double adEch6[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
static double adEch2[] = {15.03, 15.06};

double* ech = (bMens) ? adEch6 : adEch2;

cout << ech[0] <<endl;

Sylvain.

Avatar
James Kanze
On Mar 23, 4:33 pm, Sylvain Togni <"sylvain.togni at
visionobjects.com"> wrote:
Xavier wrote:
En fait j'utilise un vector par la suite (vector<double> vEch(adEch, ad Ech+
sizeof(adEch)/sizeof(*adEch))). Mais je souhaitais utiliser le tableau au
départ pour initialiser facilement les valeurs de ce tableau. Sauf er reur il
n'est pas possible d'initialiser facilement les valeurs d'un vecteur co mme
15.01, 15.02, 15.03, 15.04, 15.05, 15.05 . Et la j'ai un probleme parce que
ma déclaration + initialisation de tableau n'est pas connu en dehors de
l'expression If...


Tu peux faire soit :

vector<double> vEch;
if (bMens) {
double adEch[] = {15.01, 15.02, 15.03, 15.04, 15.05, 15.05};
vEch.assign(adEch, adEch+sizeof(adEch)/sizeof(*adEch));
}
else {
double adEch[] = {15.03, 15.06};
vEch.assign(adEch, adEch+sizeof(adEch)/sizeof(*adEch));
}


Voire même :

static double const adEch1[] = {15.01, 15.02, 15.03, 15.04, 15.05,
15.05};
static double const adEch2[] = {15.03, 15.06};
vector< double > vEch( bMens ? begin( adEch1 ) : begin( adEch2 ),
bMens ? end ( adEch1 ) : end
( adEch2 ) ) ;

(À condition, évidemment, d'avoir les begin et end templatés
habituelles.)

--
James Kanze (Gabi Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


1 2