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

Avatar
M.B.
"Jean-Marc Bourguet" a écrit dans le message news:

writes:


Nous sommes entierement d'accord et j'aurais du peut-etre mettre
un :-). Je n'enseignerais pas la micro-electronique en prealable a la
programmation. Et je doute que MB enseigne l'architecture des
processeurs modernes... moi-meme j'ai abandonne de suivre ca en detail
alors que le sujet m'interesse.



Je n'ai parlé ni de physique, ni de micro-electronique, ni de processeurs
modernes.

La connaissance, meme succinte, de ce qu'est une donnee, une adresse, une
instruction, et l'architecture generale d'un ordinateur me parait
etre un prerequis indispensable en programmation.

La connaissance du fonctionnement de la pile me parait indispensable pour
comprendre les differents types de passage d'arguments.

D'autant que toutes ces notions sont relativement simples a assimiler et
a comprendre.

Et il est pour moi evident que mieux on connait le fonctionnement interne
d'un ordinateur, mieux on peut le programmer.

MB

Avatar
Jean-Marc Bourguet
"M.B." writes:

"Jean-Marc Bourguet" a écrit dans le message news:

writes:

Nous sommes entierement d'accord et j'aurais du peut-etre mettre
un :-). Je n'enseignerais pas la micro-electronique en prealable
a la programmation. Et je doute que MB enseigne l'architecture
des processeurs modernes... moi-meme j'ai abandonne de suivre ca
en detail alors que le sujet m'interesse.



Je n'ai parlé ni de physique, ni de micro-electronique, ni de
processeurs modernes.


Ni meme vraissemblablement de processeurs anciens...

La connaissance, meme succinte, de ce qu'est une donnee, une
adresse, une instruction, et l'architecture generale d'un ordinateur
me parait etre un prerequis indispensable en programmation.


Qu'entends-tu par "architecture generale d'un ordinateur"? J'ai
l'impression que tu va me donner une architecture typique des micro
des annees 80.

La connaissance du fonctionnement de la pile me parait indispensable
pour comprendre les differents types de passage d'arguments.


Le passage des arguments est une fonctionalite abstraite definie par
le langage, la maniere de l'implementer sur ton architecture n'a
aucune importance. Et je ne vois pas l'utilite d'une pile pour passer
les arguments, on essaie plutot meme de l'eviter. (Je vois l'utilite
de la pile pour garder un contexte quand des appels recursifs sont
possibles, mais tous les langages n'autorisent pas le recursivite).

D'autant que toutes ces notions sont relativement simples a
assimiler et a comprendre.


Il est possible en effet de presenter une architecture simple possible
d'ordinateur. Son utilite pour apprendre a bien programmer me semble
douteuse. Elle peut avoir l'effet nocif de laisser penser que la
maniere evidente d'implementer quelquechose dessus est la seule
possible.

Et il est pour moi evident que mieux on connait le fonctionnement
interne d'un ordinateur, mieux on peut le programmer.


C'est bizarre, mais j'ai l'impression que la programmation est un
exercice qui consiste a batir des abstractions sur d'autres
abstractions. Et quand on programme en C++, les abstractions de plus
bas niveaux utilisees sont celles fournies par le langage C++, pas
celles de l'architecture ni celles de la micro-architecture.

A penser a trop bas niveau, on fini par croire que faire des
soustractions pour mettre en minuscule ou mettre un decalage quand on
veut faire une multiplication est savoir bien programmer.

--
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
M.B.
"Jean-Marc Bourguet" a écrit dans le message news:

"M.B." writes:


Qu'entends-tu par "architecture generale d'un ordinateur"? J'ai
l'impression que tu va me donner une architecture typique des micro
des annees 80.


L'architecture date de 1946, d'un certain Mr Von Neumann.
Rien de fondamentalement neuf depuis.


La connaissance du fonctionnement de la pile me parait indispensable
pour comprendre les differents types de passage d'arguments.


Le passage des arguments est une fonctionalite abstraite definie par
le langage, la maniere de l'implementer sur ton architecture n'a
aucune importance. Et je ne vois pas l'utilite d'une pile pour passer
les arguments, on essaie plutot meme de l'eviter. (Je vois l'utilite
de la pile pour garder un contexte quand des appels recursifs sont
possibles, mais tous les langages n'autorisent pas le recursivite).



Les arguments des fonctions passent TOUJOURS par la pile.
Je suis surpris qu'un programmeur C++ ne sache pas ca.

D'autant que toutes ces notions sont relativement simples a
assimiler et a comprendre.


Il est possible en effet de presenter une architecture simple possible
d'ordinateur. Son utilite pour apprendre a bien programmer me semble
douteuse. Elle peut avoir l'effet nocif de laisser penser que la
maniere evidente d'implementer quelquechose dessus est la seule
possible.

Et il est pour moi evident que mieux on connait le fonctionnement
interne d'un ordinateur, mieux on peut le programmer.


C'est bizarre, mais j'ai l'impression que la programmation est un
exercice qui consiste a batir des abstractions sur d'autres
abstractions. Et quand on programme en C++, les abstractions de plus
bas niveaux utilisees sont celles fournies par le langage C++, pas
celles de l'architecture ni celles de la micro-architecture.



Le B-A-BA du fonctionnement d'un ordinateur n'a rien d'abstrait.
On ne peut pas trouver plus concret.

A penser a trop bas niveau, on fini par croire que faire des
soustractions pour mettre en minuscule ou mettre un decalage quand on
veut faire une multiplication est savoir bien programmer.



Oui mettre un decalage pour multiplier par une puissance de 2, c'est
savoir programmer avec la connaissance de la machine qu'on programme.
ET cela manque a bien des programmeurs.

MB


Avatar
DG
"M.B." writes:
[...]
Les arguments des fonctions passent TOUJOURS par la pile.
Je suis surpris qu'un programmeur C++ ne sache pas ca.


Hum, je me permet d'avoir de sérieux doutes sur ce point. Pourrai-je
connaitre quelles sont tes sources (est-ce la norme qui l'impose) ?

Pour ma part, je crois que cela dépend plutôt de ton processeur et de
ton compilateur... Par exemple sur MIPS il y a 4 registres qui sont
dédiés aux arguments de fonctions (certes après on est libre de les
utiliser comme tel ou pas...). En fait je vois un seul cas où il est
réellement nécessaire d'avoir les arguments sur la pile : c'est dans
le cas des fonctions ayant un nombre d'argument variable (stdarg).

Avatar
Falk Tannhäuser
Les arguments des fonctions passent TOUJOURS par la pile.
ou dans des registres, ou bien la fonction est "inlinée" et

optimisée ...

A penser a trop bas niveau, on fini par croire que faire des
soustractions pour mettre en minuscule ou mettre un decalage quand on
veut faire une multiplication est savoir bien programmer.
Oui mettre un decalage pour multiplier par une puissance de 2, c'est

savoir programmer avec la connaissance de la machine qu'on programme.
ou manquer de la connaissance des capacités d'optimisation d'un

compilateur moderne qui fait très bien ce genre de choses ...
ET cela manque a bien des programmeurs.
Je suis d'accord qu'il est bien de savoir, par exemple, comment

une machine représente les entiers en binaire, mais pour bien de
domaines d'application, ce savoir ne me semble pas indispensable.
Il s'agit de savoir se placer sur le niveau d'abstraction approprié,
qui n'est pas le même si on écrit un driver pour un composant réseau
(gestion des registres, de la DMA, des interruptions ...) que dans
le cas d'une application qui traite des ordres d'achat / vente à
la bourse...

Falk


Avatar
M.B.
Dans tous les cas, le processeur empile les arguments,
fait au saut a la fonction appelée qui depile, execute,
depile l'adresse de retour et resaute a l'appelant.

Voir un cours d'electronique numerique de niveau DUT ou
maitrise. Ou les bases de l'Assembleur.

MB

"DG" a écrit dans le message news:

"M.B." writes:
[...]
Les arguments des fonctions passent TOUJOURS par la pile.
Je suis surpris qu'un programmeur C++ ne sache pas ca.


Hum, je me permet d'avoir de sérieux doutes sur ce point. Pourrai-je
connaitre quelles sont tes sources (est-ce la norme qui l'impose) ?

Pour ma part, je crois que cela dépend plutôt de ton processeur et de
ton compilateur... Par exemple sur MIPS il y a 4 registres qui sont
dédiés aux arguments de fonctions (certes après on est libre de les
utiliser comme tel ou pas...). En fait je vois un seul cas où il est
réellement nécessaire d'avoir les arguments sur la pile : c'est dans
le cas des fonctions ayant un nombre d'argument variable (stdarg).



Avatar
Jonathan Mcdougall
A penser a trop bas niveau, on fini par croire que faire des
soustractions pour mettre en minuscule ou mettre un decalage quand on
veut faire une multiplication est savoir bien programmer.



Oui mettre un decalage pour multiplier par une puissance de 2, c'est
savoir programmer avec la connaissance de la machine qu'on programme.
ET cela manque a bien des programmeurs.


Connaitre la machine a ajourd'hui (et heureusement) beaucoup moins
d'importance qu'avant. Le décalage est d'après moi un très mauvais
exemple de "savoir programmer avec la connaissance de la machine
qu'on programme". Et je n'arrive pas à en trouver de bons.


Jonathan


Avatar
M.B.
"Jonathan Mcdougall" a écrit dans le message
news: IxEeb.104890$

Connaitre la machine a ajourd'hui (et heureusement) beaucoup moins
d'importance qu'avant. Le décalage est d'après moi un très mauvais
exemple de "savoir programmer avec la connaissance de la machine
qu'on programme". Et je n'arrive pas à en trouver de bons.



Et quand tu as un bug 'Stack Overflow', tu fais quoi si tu
ne sais pas ce qu'est une 'stack' ?

Et tu expliques comment a des etudiants que le passage d'argument
par adresse ou par valeur ?

MB

Avatar
Jonathan Mcdougall
Connaitre la machine a ajourd'hui (et heureusement) beaucoup moins
d'importance qu'avant. Le décalage est d'après moi un très mauvais
exemple de "savoir programmer avec la connaissance de la machine
qu'on programme". Et je n'arrive pas à en trouver de bons.



Et quand tu as un bug 'Stack Overflow', tu fais quoi si tu
ne sais pas ce qu'est une 'stack' ?

Et tu expliques comment a des etudiants que le passage d'argument
par adresse ou par valeur ?


Je n'ai pas dis que l'on n'avait pas besoin de connaitre la machine
du tout, j'ai seulement dis que c'était moins beaucoup important
qu'avant.


Jonathan


Avatar
Gabriel Dos Reis
"M.B." writes:

[...]

| > > La connaissance du fonctionnement de la pile me parait indispensable
| > > pour comprendre les differents types de passage d'arguments.
| >
| > Le passage des arguments est une fonctionalite abstraite definie par
| > le langage, la maniere de l'implementer sur ton architecture n'a
| > aucune importance. Et je ne vois pas l'utilite d'une pile pour passer
| > les arguments, on essaie plutot meme de l'eviter. (Je vois l'utilite
| > de la pile pour garder un contexte quand des appels recursifs sont
| > possibles, mais tous les langages n'autorisent pas le recursivite).
| >
|
| Les arguments des fonctions passent TOUJOURS par la pile.

par decret de ?

| Je suis surpris qu'un programmeur C++ ne sache pas ca.

Ce qui est surprenant, c'est la force avec laquelle tu assènes cette
contre-vérité.

-- Gaby