Quelques questions basiques en C

Quelques questions basiques en C - Programmation

Marsh Posté le 06-06-2001 à 09:08:17    

Salut
Je suis en DEUG MIAS et je prépare un examen sur l?algorithmique en C
Et voilà quelques questions sur lesquelles je ne suis pas sûr de moi :
(ces questions ont été posées en examen tellesquelles)
 
1 Déclarer en langage C les variables suivantes :
 
a) pointeur sur fonction retournant un réel double précision
b) tableau de pointeurs sur objet de type « struct elem »
c) adresse d?une fonction retournant un « tableau » de réels
d) fonction (possédant 2 arguments :p1 tableau d?entiers et  p2 : adresse d?un réel) retournant l?adresse d?un objet  de type struct easy
 
 
2 Les affirmations suivantes,  concernant la transmission des paramètres de fonctions, sont elles vraies ou fausses :
 
a) toute variable simple (et non pointeur) est transmise par  valeur
b) tout structure(struct ou union) est transmise par adresse
c) toute fonction est transmise par valeur
 
 
3 Lors de l?évaluation des paramètres effectifs d?un appel de fonction, les règles suivantes sont elles vraies ou fausses :
 
a) les paramètres de type simple sont passés par adresse
b) les tableaux sont toujours passés par adresse
c) les structures sont toujours passées par valeur
d) les fonctions sont toujours passées par valeur
 
 
merci d?essayer d? y répondre

Reply

Marsh Posté le 06-06-2001 à 09:08:17   

Reply

Marsh Posté le 06-06-2001 à 10:12:33    

Euh... tu nous fait passer un test :??: taura certainement pas bcp de reponses :D
En plus, je vois meme pas tes reponses ? tu as essayé d'y repondre ? et donne des justifications a tes reponses...
Car je pense kici, les forumeurs sont plus du genre a te dire comment on fait ca et pkoi c kom ca plutot ke de dire "oui c ca" point final...

 

[edit]--Message édité par wouatouwouatou--[/edit]


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 06-06-2001 à 10:16:43    

1a double (*toto)(...);
1b struct elem* toto[SIZE];
1c int* (*toto)(...);
1d struct easy* toto(int*,float*);
 
essais de comprendre pourquoi...
 
2/3 en C tout est toujours passe par valeur.
les tableau etant en fait des pointeurs c'est la valeur du pointeur qui est passee ce qui revient a un passage par adresse.
 
Qu'entends tu par valeur d'une fonction ?
on ne peut avoir qu'un pointeur sur une fonction...

 

[edit]--Message édité par BENB--[/edit]

Reply

Marsh Posté le 06-06-2001 à 11:38:27    

pour ce qui est des valeurs de fonction je pense que la prof parle de la transmission d'un paramètre de type fonction à une autre fonction
 
merci BENB

Reply

Marsh Posté le 06-06-2001 à 12:12:39    

[citation]
a) les paramètres de type simple sont passés par adresse
[/citation]
 
Ca veut dire quoi ça? T'es sur que c'est un vrai prof qui vous file ces questionnaires ;)

Reply

Marsh Posté le 06-06-2001 à 12:20:43    

NKTH a écrit a écrit :

pour ce qui est des valeurs de fonction je pense que la prof parle de la transmission d'un paramètre de type fonction à une autre fonction
 
merci BENB




Je ne connais pas les parametres de type fonction...
Je connais les pointeurs de fonction.

Reply

Marsh Posté le 06-06-2001 à 13:28:24    

une fonction peut en effet prendre une autre fonction en parametre... mais dans ce cas, il fo preciser le nombre de parametre kelle prend et la liste des parametres....


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 06-06-2001 à 13:30:23    

wouatouwouatou a écrit a écrit :

une fonction peut en effet prendre une autre fonction en parametre... mais dans ce cas, il fo preciser le nombre de parametre kelle prend et la liste des parametres....




en fait elle prend un pointeur de fonction...

Reply

Marsh Posté le 06-06-2001 à 13:35:21    

:??: BENB
en C tout est toujours passe par valeur
:??:
 
c'est un peu incomplet ... tu sembles dire :
void fonction_a_la_con(char * chaine);
 
chaine est un pointeur, c'est a dire une adresse, cette adresse est passée par valeur, donc la chaine est passee par valeur ... :??: on est proche du debat philosophique ...
je pense qu'il vaut mieux dire :
quand pointeur : passage par reference
quand pas pointeur : passage par valeur ...  
au moins y'a pas d'ambiguite (j'espere) pour un gars qui tente de piger ...
on peut ajouter que la reference est passe par valeur ... ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-06-2001 à 13:39:14    

"en fait elle prend un pointeur de fonction..."
mais une fonction est un pointeur ... vers du code executable ... ;)
j'oubliais : "en C tout est toujours passe par valeur"
selon ce raisonnement, tout est toujours passe par valeur dans tous les langages ...
=> "en C, les parametres sont par defaut passe par valeur"


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-06-2001 à 13:39:14   

Reply

Marsh Posté le 06-06-2001 à 15:49:38    

En C, il y a deux types de passage :  

  • Le passage par valeur (variable non pointeur)
  • Le passage par pointeur (variable pointeur)

Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur.
 
En C++, il y a deux autres types de passage :

  • Le passage par référence
  • Le passage par référence constante

Dans ces deux passages, il n'y a pas de copie dans la pile de contexte. En effet, la fonction travaille directement sur la variable principale d'où le passage par référence constante qui empêche de la manipuler.
 
PS : Un passage par pointeur en C permet de modifier la variable pointé.
ex : cas du tableau l'adresse du tableau est copié dans la pile de contexte puisque que c'est un pointeur, mais on manipule directement le tableau pointé donc le programme appelant aura les modifications réalisées par le programme appelé.
 :hello:

 

[edit]--Message édité par DuffBeer--[/edit]

Reply

Marsh Posté le 06-06-2001 à 16:54:47    

HelloWord > Non je dis en C tout est passe par valeur, si tu passe une adresse par valeur, l'adresse ne change pas ! heureusement...
donc si c'est l'adresse de ta chaine qui est passee, c'est que ta chaine est passe par adresse...
 
Le FORTRAN passe tout par reference par exemple... donc tout les langages ne passent pas par valeur
 
DeffBeer > non les pointeurs sont aussi passes par valeur... d'ailleurs si on modifie la valeur du pointeur (pas la valeur pointee) dans la fonction celui n'est pas modifie dans l'appelant
pour simuler un passge de pointer par adresse il faut utiliser un pointeur de pointeur...
 
le C++ passe par valeur par default, on peut changer ce comportement en utilisant un passge par reference.
 
de meme le Pascal passe par valeur, mais on peux exiger un passage par adresse (ou reference) avec le var...

Reply

Marsh Posté le 06-06-2001 à 17:17:08    

on s'est pas tres bien compris ...
 
je voudrais juste que tu m'explique comment le FORTRAN il arrive à passer par reference ... en suivant ton raisonnement, tu dis que à partir du moment où une adresse est passée par valeur (ben c'est obligé non ???), alors un pointeur est passé par valeur alors tout est passé par valeur en C ... comment cela peut il etre different dans un autre langage, comme le FORTRAN :??:
 
je sais tres bien que tous les langages ne passent pas par valeur (VB : ByVal, ByRef ...) mais c'est par defaut qu'on parle ...
le C passe tout par valeur ... si je donne l'adresse de ma chaine, je passe par reference on est d'accord ... donc je viens de passer par reference ? donc le C ne passe pas tout par valeur !
 
tu sembles confondre le fait qu'un pointeur est passé (comme n'importe quoi) par valeur et qu'un objet est passé par ce pointeur ... à partir du moment où on passe un pointeur, c'est pas du pointeur qu'on se soucit, mais de l'objet pointé ... celui-ci est donc passé par référence ... bien que le pointeur soit passé par valeur ...
 
mais je pense que t'avais bien compris ca .. ;)
 
juste pour dire que :
En C, il y a deux types de passage :  
 
Le passage par valeur (variable non pointeur)  
 
Le passage par pointeur (variable pointeur)  
Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur.  
 
me semble tout a fait juste et je pense aussi que cela ne contredit pas (au contraire) ce que tu as dit !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-06-2001 à 17:28:18    

ouai ouai ... je saisi ce ke tu as voulu dire ... en fait ca depend ou on se place : au niveau du compilateur C ou au niveau du langage C = ce que tu as écris ...
toi t'es au nivo compilo : il passe tout par valeur
et nous nivo code : on a passé par reference ...
 
mais si t'es au nivo compilo, le compilo FORTRAN il passe lui aussi par valeur ... ou alors ... il passe par valeur la reference a une variable ... contrairement au C qui passe la valeur de la variable qu'on lui fourgue, le FORTRAN passe par valeur l'adresse de la variable qu'on lui fourgue ... mouai ...
je pige maintenant ce ke t'as dit ...
comme je l'avais dit au debut : on est proche du debat philosophique...
 
n'empeche qu'on est au nivo code :P
=> "tout structure(struct ou union) est transmise par adresse "
et pas au nivo compilo :na:
 
donc :
"toute fonction est transmise par valeur"
moi je repond faux ... toi tu aurais dit vrai je suppose ?
c'est l'adresse de la fonction qui est passee par valeur ... et pas elle ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-06-2001 à 17:29:22    

HelloWorld >
il n'y a pas de pointeurs en FORTRAN 77. tout est passe par adresse, c'est dire que quand j'ecris
CALL FCT(TOTO)  ! c'est l'adresse de Toto qui est empilee...
 
en C quand j'ecrit  
fct(toto); c'est la valeur de toto qui est empilee...
 
en voulant simplifier/expliquer tu ajoutes une erreur
 
en C tu peux faire fct (&toto) dans ce cas tu passe l'adresse de toto...  ... et la fonction recupere un pointeur sur toto...
 

Citation :

Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur.

 
 
NON CE N'EST CERTAINEMENT PAS L'ADRESSE DU POINTEUR qui est passe mais bien sa valeur... (qui est une adresse)
 
L'adresse d'un pointeur existe, on parle alors de pointeur de pointeur...

Reply

Marsh Posté le 06-06-2001 à 17:38:00    

HelloWord > tu t'embrouilles...
 
En C tout est passe par valeur, structure, union, scalaires, et pointeur
 
On ne passe jamais un fonction mais toujours un pointeur de fonction (voir plus haut) et ce pointeur est passe par valeur...
 
Si ta structure fais 100 ko le compilo doit copier 100ko dans la pile
 
K&R -> pour passer la copie d'un tableau le mettre dans un structure (en tant que tableau bien sur pas en tant que pointeur)
 
normalement tu doit touver dans la pile la valeur de ce que tu passe...
 
en FORTRAN on passe par adresse, toujours par adresse, dans la pile tu trouves les adresses des parametres qui ont ete passes
Si tu prefere te dire que le Fortran passe par valeur des pointeurs sur les arguments libre a toi... ...Mais pourquoi faire si complique... ...alors que c'est si simple

Reply

Marsh Posté le 06-06-2001 à 17:57:04    

:lol: :lol: :lol:
on est en train de dire la meme chose ...
=> je trouve que ce que tu viens de dire est exactement ce que j'ai écris (= ce ke je me tue à te dire :lol:)
 
ce que je voulais dire nivo compilo/code, ben tu en donnes encore l'exemple : tout est libre interpretation :
 
"Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur.
 
NON CE N'EST CERTAINEMENT PAS L'ADRESSE DU POINTEUR qui est passe mais bien sa valeur... (qui est une adresse)"
 
ben ...  
a mon avis l'auteur voulais parler de l'adresse contenue dans le pointeur et pas de l'adresse du pointeur ...
mais la phrase ne permet pas de trancher ...
pour etre sur :
 

  • l'adresse contenue dans un pointeur est passée par valeur : [*]c'est le programmeur qui effectue un passage par reference

toutes les autres variables sont passées par valeurs, ce qui est toujours le cas en C pour une variable

  • il n'est pas possible de passer directement une variable par reference : il faut pour cela passer explicitement son adresse

:sweat:
voila : cela te convient-il ? :D


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-06-2001 à 17:59:38    

yen a ki ont vraiment rien a faire de la journee :D


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 06-06-2001 à 18:06:34    

merde, fallait que je prenne mes enfants à la sortie de l'école à 16H30 !!!


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-06-2001 à 20:31:24    

Tout ca c'est une question de point de vue:
Du point de vue du compilo, tout est passe par valeur.
Du point de vue du codeur, plutot que dire qu'il a passe pas valeur l'adresse de sa variable, il dira qu'il a passe (par valeur) un pointeur sur sa variable.  
Car etant donne un prototype de fonction avec:
mafonction(montype *p);
meme si on appelle cette fonction avec: mafonction(&mavariable);
du point de vue de l'implementation de mafonction, on va travailler avec le parametre p, un pointeur.
 
A+,

 

[edit]--Message édité par gilou--[/edit]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-06-2001 à 01:26:36    

parfois un petit exemple vaut mieux qu'un long discours :
 
void swap(int *a,int *b){
  int temp = *a;
  *a = *b;
  *b = temp;
}
 
void print(int a,int b){
  printf("%d,%d\n",a,b);
}
 
//...
  swap(&val_1,&val_2);  
  print(val_1,val_2);
//...
 
on "passe" à swap les adresses de val_1 et de val_2, on peut donc dire que val_1 et val_2 sont "passées" par référence à swap
 
tandis qu'à print on "passe" val_1 et val_2 par valeur
 
 
en fait ici, tout le monde parle de la même chose, mais chacun à sa façon, c'est ce qui créé la mésentente de certains
 
dans l'absolu en C, les paramètres sont toujours passés par valeur, mais certaines de ces valeurs peuvent être des pointeurs, certains enseignants dans un but pédagogique disent dans ce cas que les paramètres sont passés par adresse, et mal interprété c'est vrai que cela peut créer des confusions chez les élèves

Reply

Marsh Posté le 07-06-2001 à 04:08:29    

La notion de "passage par valeur" et "passage par référence" se fait toujours par rapport au source. C'est pour cela que C ne connaît que le passage par valeur. Parce qu'on doit explicitement passer la référence lors de l'appel, puis la déréférencer dans la fonction.

Reply

Marsh Posté le 07-06-2001 à 06:42:43    

Et c'est relativement simple. Le passage par nom, par contre...
Ceux qui comme moi, ont implemente un compilo algol, en savent qque chose.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-06-2001 à 10:24:20    

Je suis desolee de ne pas etre de votre avis. Construire des theories compliquees ne change rien...
 
Comme le dit BifaceMcLeod il est possible d'emuler un passage par adresse en C mais il doit etre "explicite"
1- l'appelant doit explicitement passer l'adresse
2- l'appele doit explicitement recevoir une adresse
 
Vouloir cacher cela conduit a des erreurs tels que "on passe l'adresse du pointeur"... ce qui est faux... (ceci a ete dit et par DuffBeer et par HelloWorld)
 
Un pointeur est une variable comme une autre il a une adresse : la sienne, et une valeur (qui se trouve, normalement, etre l'adresse d'une autre variable)
 
un vrai passage par adresse est un passage ou :
-l'appeleant indique la variable (et non l'adresse de celle-ci)
-l'appeler recupere une variable (et non un pointeur sur celle-ci) qui est la meme physiquement que celle qui a ete passee, et non une copie.
 
Je ne vois pas de philosophie ici.
oh_damned > oui je pense que c'est de la pedagogie mal placee. Il vaut mieux comprendre ce qui se passe reelement. Mais le veritable probleme vient des pointeur qui sont trop souvent mis a part par rapport aux autres variables, d'ou l'expression malheureuse de "Adresse du pointeur" pour designer sa valeur !

Reply

Marsh Posté le 07-06-2001 à 11:59:01    

HelloWorld> Tu as globalement saisi ce que j'ai voulu dire mais je me perd dans tes explications :crazy:  
BENB> J'admet que je me suis tromper dans le terme utilisé, en effet c'est l'adresse contenue par le pointeur qui est passé donc la valeur du pointeur (sur ce point tu as raison). Mais si tu relis ce que j'ai expliqué tu remarquera qu'on a le même raisonnement : un passage par pointeur est en fait une sorte de passage par valeur sauf qu'il permet de modifier directement la variable pointé (propriété inhérente au pointeur).
 
Ensuite, il n'y a pas de philosophie dans l'utilisation de langage de prog mais juste une terminologie. Or j'insiste sur le fait qu'il n'y a que deux types de passage en C et deux autres en plus en C++ (le passage par référence qui équivaut à votre passage par adresse mais j'insiste sur le terme référence). Et il n'y a pas d'émulation en C du passage par référence :

Citation :

Comme le dit BifaceMcLeod il est possible d'emuler un passage par adresse en C mais il doit etre "explicite"  
1- l'appelant doit explicitement passer l'adresse  
2- l'appele doit explicitement recevoir une adresse Il recoit une copie de l'adresse


 
Après, il est vrai que je me place au niveau du code et non du compilo parce que des compilo il y en a des tas et chacun fait un peu à sa sauce mais le code est identique et normalisé (Cf. Stroustrup, créateur du C et du C++, pour s'en convaincre).
Mais bien sûr chacun utilise ses mots pour exprimer son idée et souvent les idées de chacun se recoupent (différent sur la forme mais pareil sur le fond).

 

[edit]--Message édité par DuffBeer--[/edit]

Reply

Marsh Posté le 07-06-2001 à 12:05:23    

HelloWorld a écrit a écrit :

:??: BENB
en C tout est toujours passe par valeur
:??:
 
c'est un peu incomplet ... tu sembles dire :
void fonction_a_la_con(char * chaine);
 
chaine est un pointeur, c'est a dire une adresse, cette adresse est passée par valeur, donc la chaine est passee par valeur ... :??: on est proche du debat philosophique ...
je pense qu'il vaut mieux dire :
quand pointeur : passage par reference
quand pas pointeur : passage par valeur ...  
au moins y'a pas d'ambiguite (j'espere) pour un gars qui tente de piger ...
on peut ajouter que la reference est passe par valeur ... ;)




 
ATTENTION, en C le passage par référence n'existe pas! c'est en C++. En C, y'a que le passage par valeur et le passage par adresse :)

Reply

Marsh Posté le 07-06-2001 à 12:08:56    

rufo> dans ce cas tu es d'accord avec moi, mais lorque tu dis passage par adresse c'est passage par pointeur. Si chacun utilise ses propres termes, moi je vais :pt1cable:

Reply

Marsh Posté le 07-06-2001 à 14:08:14    

2 précision, quand je dis :  

  • "on passe l'adresse du pointeur", je parmais évidemment de l'adresse contenue dans le pointeur, l'adresse sur laquelle il pointe.
  • "passage par référence", je parlais du passage par adresse ... je voulais faire comprendre qu'on faisait reference à l'objet directement ... qu'on manipulait pas une copie ... mais c'est vrai que ce terme était mal choisi (je ne fais pas de C++ => j'ai pas pensé au passage par référence en écrivant ceci) ;)


et par "philosophie", j'entendais que chacun se l'explique comme il veut
=> "rufo> dans ce cas tu es d'accord avec moi, mais lorque tu dis passage par adresse c'est passage par pointeur. Si chacun utilise ses propres termes, moi je vais :crazy:"


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-06-2001 à 15:14:03    

HelloWorld a écrit a écrit :

2 précision, quand je dis :  

  • "on passe l'adresse du pointeur", je parmais évidemment de l'adresse contenue dans le pointeur, l'adresse sur laquelle il pointe.
  • "passage par référence", je parlais du passage par adresse ... je voulais faire comprendre qu'on faisait reference à l'objet directement ... qu'on manipulait pas une copie ... mais c'est vrai que ce terme était mal choisi (je ne fais pas de C++ => j'ai pas pensé au passage par référence en écrivant ceci) ;)


et par "philosophie", j'entendais que chacun se l'explique comme il veut
=> "rufo> dans ce cas tu es d'accord avec moi, mais lorque tu dis passage par adresse c'est passage par pointeur. Si chacun utilise ses propres termes, moi je vais :crazy:"




si par "adresse du pointeur" tu entends valeur du pointeur, comment exprimes-tu l'adresse du pointeur ? :D

Reply

Marsh Posté le 07-06-2001 à 15:39:07    

HelloWorld a écrit a écrit :

:??: BENB
en C tout est toujours passe par valeur
:??:
 
c'est un peu incomplet ... tu sembles dire :
void fonction_a_la_con(char * chaine);
 
chaine est un pointeur, c'est a dire une adresse, cette adresse est passée par valeur, donc la chaine est passee par valeur ... :??: on est proche du debat philosophique ...
je pense qu'il vaut mieux dire :
quand pointeur : passage par reference
quand pas pointeur : passage par valeur ...  
au moins y'a pas d'ambiguite (j'espere) pour un gars qui tente de piger ...
on peut ajouter que la reference est passe par valeur ... ;)




 
si on fait :
void fonction_a_la_con(char **chaine);
est-ce bien un passage par adresse? :pt1cable:

 

[edit]--Message édité par titoine42--[/edit]

Reply

Marsh Posté le 07-06-2001 à 16:18:13    

(char) * chaine => pointeur sur un char
(char *) * chaine => pointeur sur un (char *)
 
ca change rien ... ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed