initialiser un tableau conditionnellement

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel Decima
Le #304981
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 > ?

Xavier
Le #304961
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" 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 > ?



Sylvain Togni
Le #304960
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

Xavier
Le #304959
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" 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" 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 > ?







Xavier
Le #304958
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" 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



JBB
Le #304957
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





JBB
Le #304956
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;

Xavier
Le #304955
Merci pour ta réponse JB,

"JBB" 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






Sylvain
Le #304954
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.

James Kanze
Le #304953
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


Publicité
Poster une réponse
Anonyme