j'apprends C++, et je suis confronté à ce pb : passer un tableau à une
fonction, voilà un code sans utilité mais qui permet de mettre mon pb en
avant : je reçois le message d'erreur suivant: Unresolved external
'ChangerVal(int)' referenced from module prog1.cpp
#include <iostream.h>
#include <conio.h>
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" wrote:
passer un tableau à une fonction
Les tableaux ont rarement une taille fixe et connue au moment de la compilation. Aussi, en C++ on utilise std::vector (ou ses potes) au lieu des tableaux hérités du C :
main()
Ça, c'est du C (et encore, du C très très vieux -- je ne sais même pas si c'est autorisé par le C99)
void ChangerVal (std::vector<int>& t) { if (t.size() < 2) { // Y'a une couille dans le pâté -- éventuellement, on peut lancer une exception } else { t[0]= 5; t[1]= 9; } }
int main() { std::vector<int> tableau (2); ChangerVal (tableau);
for (int i=0; i<=1; i++) {cout << tab[i]<<endl;}
PS : mets ton bouquin de C++ à la poubelle.
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin@wanadoo.fr>
wrote:
passer un tableau à une fonction
Les tableaux ont rarement une taille fixe et connue au moment de la
compilation. Aussi, en C++ on utilise std::vector (ou ses potes) au
lieu des tableaux hérités du C :
main()
Ça, c'est du C (et encore, du C très très vieux -- je ne sais même pas
si c'est autorisé par le C99)
void ChangerVal (std::vector<int>& t)
{
if (t.size() < 2)
{
// Y'a une couille dans le pâté -- éventuellement, on peut
lancer une exception
}
else
{
t[0]= 5;
t[1]= 9;
}
}
int main()
{
std::vector<int> tableau (2);
ChangerVal (tableau);
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" wrote:
passer un tableau à une fonction
Les tableaux ont rarement une taille fixe et connue au moment de la compilation. Aussi, en C++ on utilise std::vector (ou ses potes) au lieu des tableaux hérités du C :
main()
Ça, c'est du C (et encore, du C très très vieux -- je ne sais même pas si c'est autorisé par le C99)
void ChangerVal (std::vector<int>& t) { if (t.size() < 2) { // Y'a une couille dans le pâté -- éventuellement, on peut lancer une exception } else { t[0]= 5; t[1]= 9; } }
int main() { std::vector<int> tableau (2); ChangerVal (tableau);
for (int i=0; i<=1; i++) {cout << tab[i]<<endl;}
PS : mets ton bouquin de C++ à la poubelle.
Fabien LE LEZ
On Sun, 28 Sep 2003 20:59:41 +0200, Fabien LE LEZ wrote:
for (int i=0; i<=1; i++) {cout << tab[i]<<endl;}
Le message est parti trop vite, je n'ai pas eu le temps de modifier ce code. Voici donc le code corrigé :
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une fonction, voilà un code sans utilité mais qui permet de mettre mon pb en avant : je reçois le message d'erreur suivant: Unresolved external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au compilo "fais moi confiance, cette fonction est définie (avec un corps) plus loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main() { int tab[2]; tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance : il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt : std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int ! La fonction n'est donc pas la même que celle que tu déclares au début... Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur. T'as de la chance que ce soit un pointeur qui soit passé à la place du tableau... MAis si tu fais ça avec un float par exemple, tu modifieras la copie du float et non le float lui-même. Il faudrait passer en référence... Mais je ne sais pas si tu en es déjà là dans l'apprentissage du langage...
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une
fonction, voilà un code sans utilité mais qui permet de mettre mon pb
en avant : je reçois le message d'erreur suivant: Unresolved external
'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au
compilo "fais moi confiance, cette fonction est définie (avec un corps) plus
loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main()
{
int tab[2];
tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance
: il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt :
std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int
! La fonction n'est donc pas la même que celle que tu déclares au début...
Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il
t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau
à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur. T'as de la chance
que ce soit un pointeur qui soit passé à la place du tableau... MAis si tu
fais ça avec un float par exemple, tu modifieras la copie du float et non le
float lui-même. Il faudrait passer en référence... Mais je ne sais pas si tu
en es déjà là dans l'apprentissage du langage...
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une fonction, voilà un code sans utilité mais qui permet de mettre mon pb en avant : je reçois le message d'erreur suivant: Unresolved external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au compilo "fais moi confiance, cette fonction est définie (avec un corps) plus loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main() { int tab[2]; tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance : il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt : std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int ! La fonction n'est donc pas la même que celle que tu déclares au début... Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur. T'as de la chance que ce soit un pointeur qui soit passé à la place du tableau... MAis si tu fais ça avec un float par exemple, tu modifieras la copie du float et non le float lui-même. Il faudrait passer en référence... Mais je ne sais pas si tu en es déjà là dans l'apprentissage du langage...
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" wrote:
void ChangerVal (std::vector<int>& t) ... PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference soit la meilleure reponse a apporter a un debutant, vue la question posée.
Il y a ceux qui apprenne et ceux qui se la 'pete'.
T'es infiniment meilleur dans ton role de robot a repondre [HS] 3 fois par jour.
Un grand merci a Michael Monereau pour la clarete, l'exemplarite et la pedagogie de ses reponses.
MB
Christophe Lephay
"M.B." a écrit dans le message de news:bl7cuh$ibe$
"Fabien LE LEZ" a écrit dans le message news:
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" void ChangerVal (std::vector<int>& t) ... PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference soit la meilleure reponse a apporter a un debutant, vue la question posée.
D'un autre coté, il est couremment admis qu'un std::vector< int > est bien plus facile à utiliser pour un débutant qu'un int[], même si c'est un peu plus compliqué à taper...
En fait, si on devait retenir *un* type tableau en C++, je pense que ce serait plutôt le premier que le second...
Chris
"M.B." <mbinder@magicnet.com> a écrit dans le message de
news:bl7cuh$ibe$1@news-reader2.wanadoo.fr...
"Fabien LE LEZ" <gramster@gramster.com> a écrit dans le message news:
ilbenvg4bsr561n1dt0q7ep3u3rilecco5@4ax.com...
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin@wanadoo.fr>
void ChangerVal (std::vector<int>& t)
...
PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference
soit la meilleure reponse a apporter a un debutant, vue la question
posée.
D'un autre coté, il est couremment admis qu'un std::vector< int > est bien
plus facile à utiliser pour un débutant qu'un int[], même si c'est un peu
plus compliqué à taper...
En fait, si on devait retenir *un* type tableau en C++, je pense que ce
serait plutôt le premier que le second...
"M.B." a écrit dans le message de news:bl7cuh$ibe$
"Fabien LE LEZ" a écrit dans le message news:
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" void ChangerVal (std::vector<int>& t) ... PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference soit la meilleure reponse a apporter a un debutant, vue la question posée.
D'un autre coté, il est couremment admis qu'un std::vector< int > est bien plus facile à utiliser pour un débutant qu'un int[], même si c'est un peu plus compliqué à taper...
En fait, si on devait retenir *un* type tableau en C++, je pense que ce serait plutôt le premier que le second...
Chris
Carmin
merci pour ton aide précieux, je n'ai plus qu'à bûcher! bonne soirée
"Michaël Monerau" a écrit dans le message de news: GuGdb.165335$
Carmin wrote:
Bonjour,
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une fonction, voilà un code sans utilité mais qui permet de mettre mon pb en avant : je reçois le message d'erreur suivant: Unresolved external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au compilo "fais moi confiance, cette fonction est définie (avec un corps) plus
loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main() { int tab[2]; tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance
: il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt : std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int
! La fonction n'est donc pas la même que celle que tu déclares au début... Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il
t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau
à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur. T'as de la chance
que ce soit un pointeur qui soit passé à la place du tableau... MAis si tu fais ça avec un float par exemple, tu modifieras la copie du float et non le
float lui-même. Il faudrait passer en référence... Mais je ne sais pas si tu
merci pour ton aide précieux, je n'ai plus qu'à bûcher!
bonne soirée
"Michaël Monerau" <cort@meloo.com> a écrit dans le message de news:
GuGdb.165335$hd6.2126180@news.chello.at...
Carmin wrote:
Bonjour,
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une
fonction, voilà un code sans utilité mais qui permet de mettre mon pb
en avant : je reçois le message d'erreur suivant: Unresolved external
'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au
compilo "fais moi confiance, cette fonction est définie (avec un corps)
plus
loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main()
{
int tab[2];
tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait
confiance
: il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt :
std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de
int
! La fonction n'est donc pas la même que celle que tu déclares au début...
Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle
il
t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le
tableau
à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en
servir.
Et ici, fais attention... Tu passes le tableau par valeur. T'as de la
chance
que ce soit un pointeur qui soit passé à la place du tableau... MAis si tu
fais ça avec un float par exemple, tu modifieras la copie du float et non
le
float lui-même. Il faudrait passer en référence... Mais je ne sais pas si
tu
merci pour ton aide précieux, je n'ai plus qu'à bûcher! bonne soirée
"Michaël Monerau" a écrit dans le message de news: GuGdb.165335$
Carmin wrote:
Bonjour,
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une fonction, voilà un code sans utilité mais qui permet de mettre mon pb en avant : je reçois le message d'erreur suivant: Unresolved external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au compilo "fais moi confiance, cette fonction est définie (avec un corps) plus
loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main() { int tab[2]; tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance
: il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt : std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int
! La fonction n'est donc pas la même que celle que tu déclares au début... Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il
t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau
à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur. T'as de la chance
que ce soit un pointeur qui soit passé à la place du tableau... MAis si tu fais ça avec un float par exemple, tu modifieras la copie du float et non le
float lui-même. Il faudrait passer en référence... Mais je ne sais pas si tu
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" wrote:
void ChangerVal (std::vector<int>& t) ... PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference soit la meilleure reponse a apporter a un debutant, vue la question posée.
Je ne vois pas où on a « balancer du template » à qui que ce soit. Les tableaux sont des types génériques. Dans tous les langages que je connais. Qu'on met le type de base dans des <...>, ou en tête de la ligne, je ne vois pas ce que ça change pour un débuttant. En quoi est-ce que : int tab[2] ; est plus difficile pour un débuttant que : std::vector< int > tab( 2 ) ; ?
Quant aux références, c'est bien la seule façon à gérer des tableaux en C++, sans introduire des pointeurs, et surtout, l'arithmétique sur des pointeurs. Et alors ça, c'est bien quelque chose que je n'aimerais pas mettre au début d'un cours pour débuttant.
-- 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
"M.B." <mbinder@magicnet.com> wrote in message
news:<bl7cuh$ibe$1@news-reader2.wanadoo.fr>...
"Fabien LE LEZ" <gramster@gramster.com> a écrit dans le message news:
ilbenvg4bsr561n1dt0q7ep3u3rilecco5@4ax.com...
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin@wanadoo.fr>
wrote:
void ChangerVal (std::vector<int>& t)
...
PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference soit
la meilleure reponse a apporter a un debutant, vue la question posée.
Je ne vois pas où on a « balancer du template » à qui que ce soit. Les
tableaux sont des types génériques. Dans tous les langages que je
connais. Qu'on met le type de base dans des <...>, ou en tête de la
ligne, je ne vois pas ce que ça change pour un débuttant. En quoi est-ce
que :
int tab[2] ;
est plus difficile pour un débuttant que :
std::vector< int > tab( 2 ) ;
?
Quant aux références, c'est bien la seule façon à gérer des tableaux en
C++, sans introduire des pointeurs, et surtout, l'arithmétique sur des
pointeurs. Et alors ça, c'est bien quelque chose que je n'aimerais pas
mettre au début d'un cours pour débuttant.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
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
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" wrote:
void ChangerVal (std::vector<int>& t) ... PS : mets ton bouquin de C++ à la poubelle.
Je ne suis pas sur que balancer du template et du type reference soit la meilleure reponse a apporter a un debutant, vue la question posée.
Je ne vois pas où on a « balancer du template » à qui que ce soit. Les tableaux sont des types génériques. Dans tous les langages que je connais. Qu'on met le type de base dans des <...>, ou en tête de la ligne, je ne vois pas ce que ça change pour un débuttant. En quoi est-ce que : int tab[2] ; est plus difficile pour un débuttant que : std::vector< int > tab( 2 ) ; ?
Quant aux références, c'est bien la seule façon à gérer des tableaux en C++, sans introduire des pointeurs, et surtout, l'arithmétique sur des pointeurs. Et alors ça, c'est bien quelque chose que je n'aimerais pas mettre au début d'un cours pour débuttant.
-- 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
kanze
"Michaël Monerau" wrote in message news:<GuGdb.165335$...
Carmin wrote:
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une fonction, voilà un code sans utilité mais qui permet de mettre mon pb en avant : je reçois le message d'erreur suivant: Unresolved external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au compilo "fais moi confiance, cette fonction est définie (avec un corps) plus loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main() { int tab[2]; tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance : il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt : std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int !
Pas vraiment. Là, il définit une fonction avec comme argument un pointeur vers un int.
C'est d'ailleurs une des raisons pourquoi on évite des int[], et qu'on préfère des std::vector.
La fonction n'est donc pas la même que celle que tu déclares au début... Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur.
Non, il ne le passe pas par valeur. Il y a un tas de sombres histoires qui se passent derrière son dos, qui fait que d'une part, il a défini une fonction qui prend un pointeur (et non un tableau), et que d'autre part, des tableaux se convertissent en pointeur dans pas mal de contexte, et finalement, on tripôte avec l'arithmétique sur des pointeurs dans la fonction.
T'as de la chance que ce soit un pointeur qui soit passé à la place du tableau...
Je ne sais pas si c'est ce que j'appelle de la chance.
-- 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
"Michaël Monerau" <cort@meloo.com> wrote in message
news:<GuGdb.165335$hd6.2126180@news.chello.at>...
Carmin wrote:
j'apprends C++, et je suis confronté à ce pb : passer un tableau à
une fonction, voilà un code sans utilité mais qui permet de mettre
mon pb en avant : je reçois le message d'erreur suivant: Unresolved
external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis
au compilo "fais moi confiance, cette fonction est définie (avec un
corps) plus loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main()
{
int tab[2];
tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait
confiance : il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt :
std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau
de int !
Pas vraiment. Là, il définit une fonction avec comme argument un
pointeur vers un int.
C'est d'ailleurs une des raisons pourquoi on évite des int[], et qu'on
préfère des std::vector.
La fonction n'est donc pas la même que celle que tu déclares au
début... Donc le compilateur, au linkage, ne retrouve pas la fonction
sur laquelle il t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le
tableau à la C... C'est plus sûr, et aussi plus pratique quand tu sais
t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur.
Non, il ne le passe pas par valeur. Il y a un tas de sombres histoires
qui se passent derrière son dos, qui fait que d'une part, il a défini
une fonction qui prend un pointeur (et non un tableau), et que d'autre
part, des tableaux se convertissent en pointeur dans pas mal de
contexte, et finalement, on tripôte avec l'arithmétique sur des
pointeurs dans la fonction.
T'as de la chance que ce soit un pointeur qui soit passé à la place du
tableau...
Je ne sais pas si c'est ce que j'appelle de la chance.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
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
"Michaël Monerau" wrote in message news:<GuGdb.165335$...
Carmin wrote:
j'apprends C++, et je suis confronté à ce pb : passer un tableau à une fonction, voilà un code sans utilité mais qui permet de mettre mon pb en avant : je reçois le message d'erreur suivant: Unresolved external 'ChangerVal(int)' referenced from module prog1.cpp
C'est normal... Voyons ça.
void ChangerVal(int);
ici, tu déclares une fonction qui prend comme argument un int. Tu dis au compilo "fais moi confiance, cette fonction est définie (avec un corps) plus loin. Pour l'instant, fais comme si elle existe".
Bon, le compilo te croit.
main() { int tab[2]; tab[0]=tab[1]=0;
ChangerVal(tab[2]);
Ici, tu appelles la fonction ChangerVal (int). Le compilo te fait confiance : il pense que cette fonction sera définie plus tard...
getch();
utilise plutôt : std::cin.ignore ();
pour ce genre de tâche (comme ça, c'est portable).
void ChangerVal(int tab[2])
donc là, tu définis la fonction, mais avec comme argument un tableau de int !
Pas vraiment. Là, il définit une fonction avec comme argument un pointeur vers un int.
C'est d'ailleurs une des raisons pourquoi on évite des int[], et qu'on préfère des std::vector.
La fonction n'est donc pas la même que celle que tu déclares au début... Donc le compilateur, au linkage, ne retrouve pas la fonction sur laquelle il t'a fait confiance. Il se plante donc.
Mais dans l'absolu, il vaut mieux utiliser std::vector plutôt que le tableau à la C... C'est plus sûr, et aussi plus pratique quand tu sais t'en servir.
Et ici, fais attention... Tu passes le tableau par valeur.
Non, il ne le passe pas par valeur. Il y a un tas de sombres histoires qui se passent derrière son dos, qui fait que d'une part, il a défini une fonction qui prend un pointeur (et non un tableau), et que d'autre part, des tableaux se convertissent en pointeur dans pas mal de contexte, et finalement, on tripôte avec l'arithmétique sur des pointeurs dans la fonction.
T'as de la chance que ce soit un pointeur qui soit passé à la place du tableau...
Je ne sais pas si c'est ce que j'appelle de la chance.
-- 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
M.B.
a écrit dans le message news:
En quoi est-ce que : int tab[2] ; est plus difficile pour un débuttant que : std::vector< int > tab( 2 ) ; ?
C'est une blague ?
Quant aux références, c'est bien la seule façon à gérer des tableaux en C++, sans introduire des pointeurs, et surtout, l'arithmétique sur des pointeurs. Et alors ça, c'est bien quelque chose que je n'aimerais pas mettre au début d'un cours pour débuttant.
L'auteur de la question initiale a repondu en disant 'merci' la ou il fallait.
MB
<kanze@gabi-soft.fr> a écrit dans le message news:
d6652001.0309282315.3c36652a@posting.google.com...
En quoi est-ce
que :
int tab[2] ;
est plus difficile pour un débuttant que :
std::vector< int > tab( 2 ) ;
?
C'est une blague ?
Quant aux références, c'est bien la seule façon à gérer des tableaux en
C++, sans introduire des pointeurs, et surtout, l'arithmétique sur des
pointeurs. Et alors ça, c'est bien quelque chose que je n'aimerais pas
mettre au début d'un cours pour débuttant.
L'auteur de la question initiale a repondu en disant 'merci'
la ou il fallait.
En quoi est-ce que : int tab[2] ; est plus difficile pour un débuttant que : std::vector< int > tab( 2 ) ; ?
C'est une blague ?
Quant aux références, c'est bien la seule façon à gérer des tableaux en C++, sans introduire des pointeurs, et surtout, l'arithmétique sur des pointeurs. Et alors ça, c'est bien quelque chose que je n'aimerais pas mettre au début d'un cours pour débuttant.
L'auteur de la question initiale a repondu en disant 'merci' la ou il fallait.
MB
Christophe Lephay
"M.B." a écrit dans le message de news:bl9fll$d48$
a écrit dans le message news:
En quoi est-ce que : int tab[2] ; est plus difficile pour un débuttant que : std::vector< int > tab( 2 ) ; ?
C'est une blague ?
En fait, il y a une différence entre apprendre et comprendre. Si std::vector< int > tab( 2 ) est plus dur à apprendre, l'utilisation de vector ne nécessite par contre aucune compréhension particulière. C'est exactement le contraire de int tab[ 2 ] qui s'apprend très facilement, mais qui nécessite énormément de sueur avant d'en comprendre le fonctionnement, avec le problème qu'on s'expose à de sévères migraines tant qu'on ne le maitrise pas...
D'une manière générale, tous ceux qui ont l'expérience de l'enseignement te diront qu'il est bien plus facile pour un élève d'apprendre quelquechose que de le comprendre.
Chris
"M.B." <mbinder@magicnet.com> a écrit dans le message de
news:bl9fll$d48$1@news-reader2.wanadoo.fr...
<kanze@gabi-soft.fr> a écrit dans le message news:
d6652001.0309282315.3c36652a@posting.google.com...
En quoi est-ce
que :
int tab[2] ;
est plus difficile pour un débuttant que :
std::vector< int > tab( 2 ) ;
?
C'est une blague ?
En fait, il y a une différence entre apprendre et comprendre. Si
std::vector< int > tab( 2 ) est plus dur à apprendre, l'utilisation de
vector ne nécessite par contre aucune compréhension particulière. C'est
exactement le contraire de int tab[ 2 ] qui s'apprend très facilement, mais
qui nécessite énormément de sueur avant d'en comprendre le fonctionnement,
avec le problème qu'on s'expose à de sévères migraines tant qu'on ne le
maitrise pas...
D'une manière générale, tous ceux qui ont l'expérience de l'enseignement te
diront qu'il est bien plus facile pour un élève d'apprendre quelquechose que
de le comprendre.
"M.B." a écrit dans le message de news:bl9fll$d48$
a écrit dans le message news:
En quoi est-ce que : int tab[2] ; est plus difficile pour un débuttant que : std::vector< int > tab( 2 ) ; ?
C'est une blague ?
En fait, il y a une différence entre apprendre et comprendre. Si std::vector< int > tab( 2 ) est plus dur à apprendre, l'utilisation de vector ne nécessite par contre aucune compréhension particulière. C'est exactement le contraire de int tab[ 2 ] qui s'apprend très facilement, mais qui nécessite énormément de sueur avant d'en comprendre le fonctionnement, avec le problème qu'on s'expose à de sévères migraines tant qu'on ne le maitrise pas...
D'une manière générale, tous ceux qui ont l'expérience de l'enseignement te diront qu'il est bien plus facile pour un élève d'apprendre quelquechose que de le comprendre.