Bonjour,
Je suis en train de traduire un code fortran en c++.
Je n'arrive pas a trouver comment declarer un tableau avec des valeurs successives (a[]=[12, 1, 2, 3 ... 11];).
En fortran je fais :
Code:INTEGER :: a(12)=(/12, (I, I=1,11)/)
Merci
Version imprimable
Bonjour,
Je suis en train de traduire un code fortran en c++.
Je n'arrive pas a trouver comment declarer un tableau avec des valeurs successives (a[]=[12, 1, 2, 3 ... 11];).
En fortran je fais :
Code:INTEGER :: a(12)=(/12, (I, I=1,11)/)
Merci
Bonjour,
tu peux pas aussi facilement.
Mais avec une macro tu peux t'en sortir :D.
quelque chose comme
Code:
1
2
3
4
5 #define CREATE_AND_FILL_ARRAY(type, name, value_max) type name[value_max+1]; for(int _i = 0; _i < value_max; ++_i) name[_i] = _i; // use CREATE_AND_FILL_ARRAY(int, myTab, 12); // maintenant on a un int myTab[13] qui a pour valeurs 0...12
Beuh, une macro. Moi qui croyait qu'on était dans le forum C++ !
Selon si tu connais les valeurs à l'avance ou pas, et si la taille de ton tableau est susceptible de changer, il y a plusieurs solutions.
La technique la plus générique et élégante, si tu ne connais pas les valeurs à la compilation et que le tableau est susceptible de changer, consiste à utiliser un vector et l'algo std::generate(), y'a un exemple ici.
Si on décortique, y'a deux étapes importantes :
- tu déclares une classe dont le principal objectif, en gros, est de fournir une fonction "avec mémoire"
- tu créée ton vecteur et tu appelles la fonction generate() avec la fonction que tu viens de créer, ça fait le boulot sur l'intervalle nécessaireCode:
1
2
3
4
5 struct c_unique { int current; c_unique() {current=0;} int operator()() {return ++current;} } UniqueNumber;
Code:
1
2
3 std::vector<int> mon_vecteur(12); std::generate(mon_vecteur.begin(), mon_vecteur.end(), UniqueNumber);
Si le tableau est de taille fixe, utilise std::array.
Enfin, si tu connais les valeurs à l'avance ET que tu utilises un compilateur moderne, tu peux utiliser les initializer lists qui permettent d'écrire tout bêtement :
Code:std::vector<int> mon_vecteur = { 1, 2, 3, 4 };
Ce sont des outils comme les autres, et qui peuvent s'avérer très pratiques.Citation:
Beuh, une macro. Moi qui croyait qu'on était dans le forum C++ !
Parce que si je me retrouve à en créer une dizaine de ces tableaux, oui j'employerais une macro, quitte à me faire flageller :sm:Code:
1
2
3
4
5
6
7 struct c_unique { int current; c_unique() {current=0;} int operator()() {return ++current;} } UniqueNumber; #define CREATE_AND_FILL_ARRAY(type, name, max_value) std::vector<type> name(max_value+1); \ std::generate(name.begin(), name.end(), UniqueNumber);
La lisibilité est largement améliorée, AMHA, dans mon code en utilisant
que si je recopie les 2 lignes à chaque fois.Code:
1
2
3
4 CREATE_AND_FILL_ARRAY(int, tab1, 12); CREATE_AND_FILL_ARRAY(int, tab2, 11); CREATE_AND_FILL_ARRAY(int, tab3, 14); // ...
D'ailleurs, puisqu'on connait la taille (que je suppose fixe - je ne connais pas fortran), des std::array seront surement mieux.
merci a tous les deux pour vos réponse.