OVH Cloud OVH Cloud

[débutant]

7 réponses
Avatar
slowlearner
Bonjour, je débute en C++ et apprécierait si qqn pouvait m'expliquer
pourquoi le bout de code suivant ne marche pas :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
vector<int> a[10], b[10], c[10];

for (int i = 0; i < 10; i++) a[i] = i;
for (int i = 0; i < a.size(); i++) b[i] = a[i] * 10;
for (int i = 0; i < b.size(); i++) c[i] = a[i] + b[i];

for (int i = 0; i < c.size(); i++)
cout << a[i] << "\t" << b[i] << "\t" << c[i] << endl;

system("PAUSE");
return 0;
}


le compilateur s'arrête dès la première boucle ...

7 réponses

Avatar
Bruno CAUSSE
dans l'article 43550bf3$0$657$, slowlearner à
a écrit le 18/10/05 16:51 :

Bonjour, je débute en C++ et apprécierait si qqn pouvait m'expliquer
pourquoi le bout de code suivant ne marche pas :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
vector<int> a[10], b[10], c[10];


Des parentheses plutot que des crochets

vector<int> a(10), b(10), c(10);


for (int i = 0; i < 10; i++) a[i] = i;
for (int i = 0; i < a.size(); i++) b[i] = a[i] * 10;
for (int i = 0; i < b.size(); i++) c[i] = a[i] + b[i];

for (int i = 0; i < c.size(); i++)
cout << a[i] << "t" << b[i] << "t" << c[i] << endl;

system("PAUSE");
return 0;
}


le compilateur s'arrête dès la première boucle ...


Avatar
Jean-Marc Bourguet
slowlearner writes:

vector<int> a[10], b[10], c[10];


Cette ligne ne fait vraissemblablement pas ce que tu veux. Elle
declare des tableaux de 10 vector<int> appelees a b et c. Tu veux
vraissemblablement initialiser 3 vector<int> a une taille de 10.
C'est
vector<int> a(10), b(10), c(10);
qu'il faut faire.

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
slowlearner
Jean-Marc Bourguet wrote:
slowlearner writes:


vector<int> a[10], b[10], c[10];



Cette ligne ne fait vraissemblablement pas ce que tu veux. Elle
declare des tableaux de 10 vector<int> appelees a b et c. Tu veux
vraissemblablement initialiser 3 vector<int> a une taille de 10.
C'est
vector<int> a(10), b(10), c(10);
qu'il faut faire.

A+




Merci pour la réponse !


Avatar
slowlearner
Bruno CAUSSE wrote:
dans l'article 43550bf3$0$657$, slowlearner à
a écrit le 18/10/05 16:51 :


Bonjour, je débute en C++ et apprécierait si qqn pouvait m'expliquer
pourquoi le bout de code suivant ne marche pas :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
vector<int> a[10], b[10], c[10];



Des parentheses plutot que des crochets

vector<int> a(10), b(10), c(10);


for (int i = 0; i < 10; i++) a[i] = i;
for (int i = 0; i < a.size(); i++) b[i] = a[i] * 10;
for (int i = 0; i < b.size(); i++) c[i] = a[i] + b[i];

for (int i = 0; i < c.size(); i++)
cout << a[i] << "t" << b[i] << "t" << c[i] << endl;

system("PAUSE");
return 0;
}


le compilateur s'arrête dès la première boucle ...



Merci pour la réponse !



Avatar
slowlearner
slowlearner wrote:
Bonjour, je débute en C++ et apprécierait si qqn pouvait m'expliquer
pourquoi le bout de code suivant ne marche pas :

#include <iostream>
#include <vector>
using namespace std;

int main()
{
vector<int> a[10], b[10], c[10];

for (int i = 0; i < 10; i++) a[i] = i;
for (int i = 0; i < a.size(); i++) b[i] = a[i] * 10;
for (int i = 0; i < b.size(); i++) c[i] = a[i] + b[i];

for (int i = 0; i < c.size(); i++)
cout << a[i] << "t" << b[i] << "t" << c[i] << endl;

system("PAUSE");
return 0;
}


le compilateur s'arrête dès la première boucle ...


Bon, maintenant que l'histoire des parenthèses/crochets est réglée, je
remarque également que si je ne déclare pas les tailles des vecteurs,
c'est à dire si j'ai : vector<int> a, b, c, j'ai un magnifique plantage
du programme (carrément le message d'erreur de windows ! vraiment la
classe ;-)) et pour le faire fonctionner, il faut que je passe par la
fonction push_back().

Pourquoi ?!?

Avatar
Bruno CAUSSE
dans l'article 43551519$0$28143$, slowlearner à
a écrit le 18/10/05 17:30 :

Bon, maintenant que l'histoire des parenthèses/crochets est réglée, je
remarque également que si je ne déclare pas les tailles des vecteurs,
c'est à dire si j'ai : vector<int> a, b, c, j'ai un magnifique plantage
du programme (carrément le message d'erreur de windows ! vraiment la
classe ;-)) et pour le faire fonctionner, il faut que je passe par la
fonction push_back().

Pourquoi ?!?


La taille size n'etant pas definie a la creation, (size 0 par defaut?),
l'operateur [] ne fonctionne pas pour l'ajout d'element, contrairement a
push_back() qui est fait pour.

Avatar
kanze
Bruno CAUSSE wrote:
dans l'article 43551519$0$28143$,
slowlearner à a écrit le 18/10/05
17:30 :

Bon, maintenant que l'histoire des parenthèses/crochets est
réglée, je remarque également que si je ne déclare pas les
tailles des vecteurs, c'est à dire si j'ai : vector<int> a,
b, c, j'ai un magnifique plantage du programme (carrément le
message d'erreur de windows ! vraiment la classe ;-)) et
pour le faire fonctionner, il faut que je passe par la
fonction push_back().

Pourquoi ?!?


La taille size n'etant pas definie a la creation, (size 0 par
defaut?), l'operateur [] ne fonctionne pas pour l'ajout
d'element, contrairement a push_back() qui est fait pour.


La taille est bien 0 par défaut. L'idée, je crois, c'est de ne
pas avoir à construire les objets éléments avant d'avoir
l'initialisateur. Il est donc prèsqu'idiomatique de définir le
tableau vide, puis de le remplir à coup de push_back. L'autre
alternatif, si j'ai des itérateurs qui me donne les valeurs
initiales, c'est d'utiliser le constructeur à deux itérateurs,
c-à-d :

std::vector< int > a( iterBegin, iterEnd ) ;

Si j'écris quelque chose comme :

std::vector< int > a( 10 ) ;

j'initialise avec dix fois le constructeur par défaut (ici,
int(), c-à-d 0). C'est rarement intéressant (mais des vecteurs
de types arithmétiques pourraient en être une exception).

--
James Kanze GABI Software
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