OVH Cloud OVH Cloud

passer un tableau à une fonction

99 réponses
Avatar
Carmin
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]<<endl;}
getch();
}

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

10 réponses

1 2 3 4 5
Avatar
M.B.
"Christophe Lephay" a écrit dans le message
news: bl9g0c$idf$
"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




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



Avatar
Michaël Monerau
wrote:
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.

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 :-) Il aura le temps de voir ça après !
Mais c'est vrai que les vector sont beaucoup plus simples ici.

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 -=>



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


eheh :)
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 -=>

Avatar
Christophe Lephay
"M.B." a écrit dans le message de
news:bl9g97$f87$
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

Avatar
Michaël Monerau
M.B. wrote:
Il y a ceux qui apprenne et ceux qui se la 'pete'.


Je suis bien certain que Fabien ne voulait pas "se la péter". Il a voulu lui
donner une réponse complète, de ce qu'il pensait. Il n'a peut-être pas
beaucoup détailler pour le débutant... Mais ça le met sur la voie, et il
peut ensuite chercher "std::vector" dans google ou dans son livre. Si
j'étais débutant, j'attendrais qu'on me donne la meilleure solution à ma
question, quitte à ce que ça nécessite une recherche personnelle. On ne peut
pas *tout* dire dans un message, quand c'est une question qui met en jeu un
tel nombre de choses sous-jacentes. (c'est ce que j'ai essayé de faire en
lui indiquant que vector était mieux adapté... mais en lui expliquant aussi
pourquoi sa solution n'était pas *bien*).

Un grand merci a Michael Monereau pour la clarete, l'exemplarite et
la pedagogie de ses reponses.


De rien :-)
Tant qu'on est aux heures de félicitations, je constate avec plaisir que tu
réponds maintenant dans le bon sens... Merci et bravo d'avoir changé d'avis
!
;-)
--
<=- Michaël "Cortex" Monerau -=>

Avatar
Michaël Monerau
M.B. wrote:
On ne peut pas apprendre un langage informatique sans le comprendre,
c'est ridicule et grotesque.


Alors, tu apprends à tes élèves la surcharge de l'opérateur '<<', le
namespace std, les streams et les manipulators à tes élèves débutants pour
écrire 'std::cout << "Hello World !" << std::endl;" ?

Plus sérieusement, il y a des moments où il faut bien démarrer par quelque
chose... On ne peut pas vouloir expliquer tous les tenants et les
aboutissants de chaque ligne dès le début de l'apprentissage (il y a souvent
des corrélations très complexes entre tous les concepts dits "de base" comme
ce Hello World). Ces choses là se découvrent ensuite, avec les lectures et
les exemples... Enfin, c'est comme ça que ça a marché pour moi.
--
<=- Michaël "Cortex" Monerau -=>

Avatar
M.B.
"Christophe Lephay" a écrit dans le message
news: bl9gms$h2k$
"M.B." a écrit dans le message de
news:bl9g97$f87$
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




Je suis me toujours farouchement opposé a ce type d'enseignement.
On commence par comprendre la structure interne d'un calculateur,
sa memoire, son micro, ses peripheriques, ses bus, ses adresses et
ses donnees.

Apres la programmation est beaucoup plus facile et apprendre et a
comprendre. Je n'envisage pas un seul instant de tenter d'enseigner
la programmation a des gens qui ne savent pas comment fonctionne
un ordinateur. C'est voué a l'echec. Au premier bug du genre
'Stack Overflow' ils sont coincés.

Dans cette demarche,

int tab[2] est beaucoup plus simple a comprendre que
std::vector<int> tab (2)

MB


Avatar
M.B.
"Michaël Monerau" a écrit dans le message news:
NEXdb.181628$

Tant qu'on est aux heures de félicitations, je constate avec plaisir que
tu

réponds maintenant dans le bon sens... Merci et bravo d'avoir changé
d'avis


Tu es bon pedagogue.

MB

Avatar
Michaël Monerau
M.B. wrote:
"Michaël Monerau" a écrit dans le message news:
NEXdb.181628$

Tant qu'on est aux heures de félicitations, je constate avec plaisir
que tu réponds maintenant dans le bon sens... Merci et bravo d'avoir
changé d'avis


Tu es bon pedagogue.


Je n'ai pourtant que 16 ans :-)
Je suis flatté, tu vas me faire rougir ;-)
--
<=- Michaël "Cortex" Monerau -=>


Avatar
Christophe Lephay
"M.B." a écrit dans le message de
news:bl9h5v$7qp$
Je suis me toujours farouchement opposé a ce type d'enseignement.
On commence par comprendre la structure interne d'un calculateur,
sa memoire, son micro, ses peripheriques, ses bus, ses adresses et
ses donnees.

Apres la programmation est beaucoup plus facile et apprendre et a
comprendre. Je n'envisage pas un seul instant de tenter d'enseigner
la programmation a des gens qui ne savent pas comment fonctionne
un ordinateur. C'est voué a l'echec. Au premier bug du genre
'Stack Overflow' ils sont coincés.


Personnellement, je serais pour l'apprentissage des deux simultanément. Par
ailleurs, lorsque c'est un débutant qui pose une question sur usenet, c'est
dur de savoir ce qu'il sait de l'architecture interne des ordinateurs ou des
systèmes d'exploitation...

D'ailleurs, en respectant les principes sous-jacent ta chronologie, il
faudrait étudier en détail le fonctionnement d'un système d'exploitation
avant d'étudier la programmation.

On a juste un ensemble de connaissances, certaines sont dépendantes
d'autres, d'autres non. S'il est parfaitement sensé d'établir une
chronologie pour celles qui le sont, vouloir l'appliquer aussi à celles qui
ne le sont pas relève de la psycho-rigidité ;)

Dans cette demarche,

int tab[2] est beaucoup plus simple a comprendre que
std::vector<int> tab (2)


Pas selon l'expérience de ceux qui ont testé les deux approches...

(comme quoi c'est toujours la pratique qui tranche, quelque soit la
vraisemblance de la théorie).

Chris

1 2 3 4 5