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

6 7 8 9 10
Avatar
Michel Michaud
Dans news:blf46d$tu1$,
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.


C'est tout ce que tu sais ? Il te manque un certain nombre
de possibilités. (Et j'ai lu la suite des discussions :
mettre des valeurs dans un registre ce n'est pas pareil
que d'empiler quelque chose; j'imagine que tu as compris que
ton affirmation était fausse et que tu essaies de t'en sortir
honorablement, mais c'est un peu gros car je dirais que cette
affirmation est encore moins bonne que l'autre !)

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


Je crois que ceux-là ne voit que ce qu'ils veulent voir.
Une abstraction quoi (je constate que plusieurs ont cité
ce mot). Mais faire abstraction du fait qu'il existe autre
chose, ce n'est pas l'idéal !

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans news:blf0bf$8ot$,
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.


Il me semble que décaler au lieu de multiplier c'est aussi une
mauvaise connaissance de ce que font les compilateurs, une mauvaise
connaissance des règles de l'optimisation et une mauvaise connaissance
du processus de développement des logiciels (la maintenance).

Par ailleurs, il me semble ce n'est pas tant une connaissance de la
machine qu'une connaissance du langage (est-ce que tous les langages
qui offrent le décalage ont seulement des entiers en binaire pur ?).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

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

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


Tu me doit un trollometre. Le mien vient d'exploser.

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

"M.B." writes:

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


Tu me doit un trollometre. Le mien vient d'exploser.


Si quelqu'un veut mon opinion, il vaut mieux changer ouvrir un nouveau
fil de discussion.

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
kanze
"M.B." wrote in message
news:<blf0bf$8ot$...
"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.


Tu veux nous faire rire, ou quoi ?

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.


Je me démande alors comment on fait sur les machines sans pile. Et quand
je régarde le code généré sur mon Sparc, je trouve que les paramètres
simples se trouve dans les régistres, non dans la pile. C'était pareil
sur les machines sous HP/UX.

En fait, le passage des paramètres par la pile est plutôt une solution
exceptionnelle aujourd'hui, nécessité par l'architecture périmée de
certains processeurs, mais à éviter autant que ce peut.

Mais je ne m'attends pas à ce qu'un programmeur des applications en C++
sache ce genre de détail.

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.


C'est surtout viser l'obfuscation. Un programmeur qui fait ça
aujourd'hui a bien montré son incompétence.

ET cela manque a bien des programmeurs.


Quoi, l'incompétence ?

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



Avatar
kanze
"M.B." wrote in message
news:<blf46d$tu1$...

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.


Même les processeurs sans pile ?

Mais vraiment, je me démande s'il t'est déjà arrivé à régarder un
processeur. Sous Sparc, je mets mes paramètres dans des régistres o0,
o1, etc., pour que la fonction appelé les rétrouve dans i0, i1 ...

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


Quel assembleur ? IBM 390 ? Sparc ?

En fait, même sur Intel, quand j'écrivais un noyau temps-réel (où la
performance était critique, et qu'on travaillait en assembleur), je
passais les paramètres par les régistres. Beaucoup plus rapide.

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

Avatar
kanze
"M.B." wrote in message
news:<blf7r5$gu6$...
"Jonathan Mcdougall" a écrit dans le
message news: fkFeb.104903$
Que ce soit la pile ou un registre specialisé dans un
processeur particulier, ca ne change rien.

Mon propos est de dire qu'il vaut mieux connaitre ces
mecanismes, ca aide a comprendre certains effets pervers de
programmes en phase de debug.


Et le mien était de dire que ton assertion « Les arguments des
fonctions passent TOUJOURS par la pile. Je suis surpris qu'un
programmeur C++ ne sache pas ca » est fausse.


Tu joues sur les mots.


Peut-être, mais sur un mot écris en MAJUSCULE. Disons que ça attire
un peu plus l'attention des gens. Surtout quand c'est faux.


Non c'est pas faux. Une pile ou une serie de registres speciaux, c'est
du pareil au meme.


Alors, non seulement tu ne connais pas l'architecture des ordinateurs
modernes, mais tu ne comprends même pas le concept de pile.

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





Avatar
kanze
"Michel Michaud" wrote in message
news:<6TKeb.5117$...
Dans news:blf0bf$8ot$,
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.


Il me semble que décaler au lieu de multiplier c'est aussi une
mauvaise connaissance de ce que font les compilateurs, une mauvaise
connaissance des règles de l'optimisation et une mauvaise connaissance
du processus de développement des logiciels (la maintenance).


Selon la machine, c'est aussi peut-être une mauvaise connaissance du
hardware. Je me suis déjà servi des machines où la multiplication était
plus rapide que le décalage (NSC 32000, par exemple).

Mais pour confirmer ce que tu dis : je travaille actuellement sur des
Sparcs, qui sont des machines RISC, et qui n'ont pas de multiplication
cablée. N'empêche que dans mes benchmarks, quand j'écris la
multiplication, le programme tourne plus vide que quand j'écris des
décalages (ou pareil, selon le compilateur).

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


Avatar
Samuel Krempp
le Wednesday 01 October 2003 20:52, écrivit :

Non c'est pas faux. Une pile ou une serie de registres speciaux,
c'est du pareil au meme.


alors quel est l'interêt pour le programmeur de connaître des détails sur le
passage des fonctions, si le mécanisme concret peut varier tout en restant
"du pareil au même" ?

C'est bien le signe que ce qui est important, c'est de connaître les
propriétés du passage d'arguments, qu'on le voit en terme d'abstraction -de
boîte noire-, ou bien modélisé d'une certaine façon, en termes
d'abstractions plus bas niveau (registres, pile, ...)
La connaissance d'une modélisation détaillée ou d'une autre n'a pas bcp
d'interêt pour le programmeur (si ce n'est de pouvoir fournir une
explication historique à pourquoi la boîte noire a telle ou telle
propriété). Il devrait pouvoir raisonner sur l'abstraction elle même
jusqu'à s'en faire une image plus précise qu'en raisonnant par analogie
avec une modélisation donnée.
Pas besoin donc d'imposer plus de connaissances aux étudiants qui découvrent
la programmation.
Si ils demandent pourquoi c'est comme ça, la réponse est simple : parceque
au moment où le langage est conçu, il l'est de manière à être aussi
performant que possible sur les machines existantes, et les choix sont donc
fait en fonctions de propriétés de l'architecture des ordinateurs à ce
moment.
références disponibles pour ceux qui veulent des détails, et zou on
continue.

--
Sam

Avatar
kanze
Falk Tannhäuser wrote in message
news:...

Les arguments des fonctions passent TOUJOURS par la pile.


ou dans des registres, ou bien la fonction est "inlinée" et
optimisée ...


Ou par des adresses fixes en mémoire. J'ai déjà travaillé sur une
machine où l'instruction call stockait l'adresse suivante à l'adresse du
sous-programme, puis sautait à l'adresse + 1. (C'était une machine à
adressage mot. L'adresse + 1 donnait donc l'adresse du prochain mot.)
Normallement, on mettait les paramètres directement derrière
l'instruction call (en plein milieu du code) -- le sous-programme
utilisait l'adresse pour rechercher les paramètres, en l'incrémentant,
de façon à ce que quand il voulair retourner, il retournait derrière le
bloc des paramètres.

Dans les années '70, c'était probablement la façon la plus fréquente à
passer des paramètres. (Je l'ai vu sur pas mal de machines à l'époque.)

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


Ou même manquer de la connaissance du hardware. Sur le NSC 32000, la
multiplication était plus rapide (et de loin) que les décalages.

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


En effet. Si on fait le calcul numérique (ce que font intensemment les
programmes du marché), ce qu'il faut surtout c'est le calcul numérique :
les problèmes de stabilité face à une représentation discrète, par
exemple.

Plus généralement : si tu fais des applications commerciales,
l'architecture des bases de données est probablement plus importante que
l'architecture de la machine. Ainsi que la notion d'une transaction,
etc.

Si tu fais des applications industrielles, selon le niveau, il se peut
que tu aies besoin des connaissances hardware plus approfondies. Mais ce
n'est pas sûr -- aujourd'hui, il y a presque toujours une couche plus
base, du genre vxWorks, qui t'en isoles pas mal, et dans une équipe, il
n'y aurait qu'une ou deux personnes qui s'occupent des pilotes
spécifiques.

Si tu fais des applications du reseau, il te faut plus une connaissance
de l'architecture du reseau que de l'architecture de la machine.

Enfin, pour combler les domaines où j'ai réelement de l'expérience : si
tu fais du logiciel système : un compilateur ou un OS, alors là, oui, tu
as besoin de connaître, et bien, l'architecture de la machine.

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



6 7 8 9 10