C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

passer un tableau à une fonction
Goto page 1, 2, 3, 4, 5, 6, 7  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Carmin
Guest





PostPosted: Sun Sep 28, 2003 6:54 pm    Post subject: passer un tableau à une fonction Reply with quote



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
#include <iostream.h>
#include <conio.h>

void ChangerVal(int);

main()
{
int tab[2];
tab[0]=tab[1]=0;

ChangerVal(tab[2]);
for (int i=0; i<=1; i++)
{cout << tab[i]< getch();
}

void ChangerVal(int tab[2])
{
tab[0]=5;
tab[1]=10;
}
merci de votre aide



Back to top
Fabien LE LEZ
Guest





PostPosted: Sun Sep 28, 2003 6:59 pm    Post subject: Re: passer un tableau à une fonction Reply with quote



On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin (AT) wanadoo (DOT) fr>
wrote:

Quote:
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 :

Quote:
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 ChangerVal (tableau);

for (int i=0; i<=1; i++)
{cout << tab[i]<



PS : mets ton bouquin de C++ à la poubelle.


Back to top
Fabien LE LEZ
Guest





PostPosted: Sun Sep 28, 2003 7:02 pm    Post subject: Re: passer un tableau à une fonction Reply with quote



On Sun, 28 Sep 2003 20:59:41 +0200, Fabien LE LEZ
<gramster (AT) gramster (DOT) com> wrote:

Quote:
for (int i=0; i<=1; i++)
{cout << tab[i]<

Le message est parti trop vite, je n'ai pas eu le temps de modifier ce
code. Voici donc le code corrigé :

1ère version, pour faire presque comme toi :

for (int i=0; i {
cout << tab[i] << endl;
}

2è version, un peu plus "STL" :

for (std::vector i!=tableau.end(); ++i)
{
cout << *i << endl;
}

3è version, plus appréciée des habitants de fclc++ mais moins
facilement compréhensible :

std::copy (tableau.begin(), tableau.end,
std::ostream_iterator

Back to top
Michaël Monerau
Guest





PostPosted: Sun Sep 28, 2003 7:19 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

Carmin wrote:
Quote:
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.

Quote:
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.

Quote:
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...

Quote:
getch();

utilise plutôt :
std::cin.ignore ();

pour ce genre de tâche (comme ça, c'est portable).

Quote:
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...

Quote:
merci de votre aide

De rien, j'espère t'avoir aidé.
--
<=- Michaël "Cortex" Monerau -=>



Back to top
M.B.
Guest





PostPosted: Sun Sep 28, 2003 7:32 pm    Post subject: Re: passer un tableau à une fonction Reply with quote


"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]ilbenvg4bsr561n1dt0q7ep3u3rilecco5 (AT) 4ax (DOT) com[/email]...
Quote:
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin (AT) wanadoo (DOT) fr
wrote:


void ChangerVal (std::vector ...
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




Back to top
Christophe Lephay
Guest





PostPosted: Sun Sep 28, 2003 7:59 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

"M.B." <mbinder (AT) magicnet (DOT) com> a écrit dans le message de
news:bl7cuh$ibe$1 (AT) news-reader2 (DOT) wanadoo.fr...
Quote:
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]ilbenvg4bsr561n1dt0q7ep3u3rilecco5 (AT) 4ax (DOT) com[/email]...
On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin (AT) wanadoo (DOT) fr
void ChangerVal (std::vector ...
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



Back to top
Carmin
Guest





PostPosted: Sun Sep 28, 2003 8:13 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

merci pour ton aide précieux, je n'ai plus qu'à bûcher!
bonne soirée

"Michaël Monerau" <cort (AT) meloo (DOT) com> a écrit dans le message de news:
GuGdb.165335$hd6.2126180 (AT) news (DOT) chello.at...
Quote:
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
en es déjà là dans l'apprentissage du langage...

merci de votre aide

De rien, j'espère t'avoir aidé.
--
=- Michaël "Cortex" Monerau -=





Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Sep 29, 2003 7:15 am    Post subject: Re: passer un tableau à une fonction Reply with quote

"M.B." <mbinder (AT) magicnet (DOT) com> wrote

Quote:
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message news:
[email]ilbenvg4bsr561n1dt0q7ep3u3rilecco5 (AT) 4ax (DOT) com[/email]...

On Sun, 28 Sep 2003 20:54:33 +0200, "Carmin" <gam.carmin (AT) wanadoo (DOT) fr
wrote:

void ChangerVal (std::vector ...
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 (AT) gabi-soft (DOT) 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

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Sep 29, 2003 7:21 am    Post subject: Re: passer un tableau à une fonction Reply with quote

"Michaël Monerau" <cort (AT) meloo (DOT) com> wrote


Quote:
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.

Quote:
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.

Quote:
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 (AT) gabi-soft (DOT) 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

Back to top
M.B.
Guest





PostPosted: Mon Sep 29, 2003 2:30 pm    Post subject: Re: passer un tableau à une fonction Reply with quote


<kanze (AT) gabi-soft (DOT) fr> a écrit dans le message news:
[email]d6652001.0309282315.3c36652a (AT) posting (DOT) google.com[/email]...

Quote:
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 ?

Quote:

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




Back to top
Christophe Lephay
Guest





PostPosted: Mon Sep 29, 2003 2:36 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

"M.B." <mbinder (AT) magicnet (DOT) com> a écrit dans le message de
news:bl9fll$d48$1 (AT) news-reader2 (DOT) wanadoo.fr...
Quote:

[email]kanze (AT) gabi-soft (DOT) fr[/email]> a écrit dans le message news:
[email]d6652001.0309282315.3c36652a (AT) posting (DOT) google.com[/email]...

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



Back to top
M.B.
Guest





PostPosted: Mon Sep 29, 2003 2:41 pm    Post subject: Re: passer un tableau à une fonction Reply with quote


"Christophe Lephay" <christophe-lephay (AT) wanadoo (DOT) fr> a écrit dans le message
news: bl9g0c$idf$1 (AT) news-reader1 (DOT) wanadoo.fr...
Quote:
"M.B." <mbinder (AT) magicnet (DOT) com> a écrit dans le message de
news:bl9fll$d48$1 (AT) news-reader2 (DOT) wanadoo.fr...

[email]kanze (AT) gabi-soft (DOT) fr[/email]> a écrit dans le message news:
[email]d6652001.0309282315.3c36652a (AT) posting (DOT) google.com[/email]...

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



Ca tombe bien, j'ai 18 annees d'experience d'enseignement.

On ne peut pas apprendre un langage informatique sans le comprendre,
c'est ridicule et grotesque.

MB




Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 29, 2003 2:41 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote:
Quote:
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.

Je ne voulais pas l'embrouiller avec des pointeurs, s'il en est aux
tableaux... Mais, c'est vrai que c'est peut-être mieux de mettre les mots
justes dès le début.

Quote:
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.

C'est ce que je dis dans la phrase suivante, mais pas aussi poussé, c'est un
débutant... Ne l'embrouillons pas Smile Il aura le temps de voir ça après !
Mais c'est vrai que les vector sont beaucoup plus simples ici.

Quote:
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.

Je voulais dire : "t'as de la chance, ça ferait bien le résultat que tu
attends (i.e. modifier le tableau donné en argument par l'appelant), mais
c'est un cas particulier".
--
<=- Michaël "Cortex" Monerau -=>



Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 29, 2003 2:45 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

Carmin wrote:
Quote:
merci pour ton aide précieux, je n'ai plus qu'à bûcher!
bonne soirée

eheh Smile
De rien. Bonne soirée à toi aussi.

et passe faire un tour ici aussi :
http://www.giromini.org/usenet-fr/repondre.html

;-)
--
<=- Michaël "Cortex" Monerau -=>



Back to top
Christophe Lephay
Guest





PostPosted: Mon Sep 29, 2003 2:48 pm    Post subject: Re: passer un tableau à une fonction Reply with quote

"M.B." <mbinder (AT) magicnet (DOT) com> a écrit dans le message de
news:bl9g97$f87$1 (AT) news-reader2 (DOT) wanadoo.fr...
Quote:
On ne peut pas apprendre un langage informatique sans le comprendre,
c'est ridicule et grotesque.

Mais en général, il faut commencer par apprendre et la compréhension vient
après. C'est assez peu fréquent que la compréhension apparaisse par
génération spontanée.

Particulièrement, la compréhension des tableaux de type C nécessitent pas
mal de pré-requis, notemment en termes d'organisation de la mémoire.
L'avantage de vector, c'est qu'il ne nécessite pas de tels pré-requis. On
pourra demander à l'élève de comprendre un peu mieux l'organisation de la
mémoire à un moment plus opportun qu'au tout début de son apprentissage...

Chris



Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3, 4, 5, 6, 7  Next
Page 1 of 7

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.