procédure ou fonction - C - Programmation
Marsh Posté le 27-02-2018 à 23:34:30
Lu,
Citation : qui réalise la modification de la valeur d’une variable x |
Personnellement, j'en comprends qu'il s'agit de passer un pointeur de façon à directement altérer la variable x de départ. Donc il s'agirait plutôt d'une procédure.
Code :
|
Après, effectivement, ta solution, au final, donnera strictement le même résultat. M'est d'avis qu'en tant qu'exercice ça aurait mérité d'être plus clair/explicite et moins ambigu (type lui faire retourner autre chose en plus ou vous dire carrément qu'elle est void ou modifier plus d'un paramètre)
Citation : je ne vois pas en quoi une fonction ne pourrait pas modifier la valeur du premier argument passé |
C'est inexact/faux (ou tu t'exprimes mal) : avec ta fonction, la valeur du paramètre ne sera jamais directement modifiée (je veux dire que si tu faisais simplement dans la fonction a1 *= a2 sans tenir compte d'une quelconque valeur retournée, x aurait toujours sa valeur de départ, copie des arguments oblige). Cette variable x n'est modifiée que parce que tu lui réaffectes la valeur retournée par la fonction Q2, ce qui est bien différent. Est-ce que tu comprends l'idée ? (pour le coup je ne sais pas si je suis moi-même compréhensible)
Marsh Posté le 27-02-2018 à 23:57:24
oui bien sur que la fonction ne modifie les variables qu'en elle-meme, sans répercution à l'extérieur. Je me suis mal exprimée en effet. Et tu as raison, je trouve aussi que la question n'est pas assez compréhensible. Merci pour tes confirmations/reprises.
Marsh Posté le 28-02-2018 à 14:12:26
En fait, si, la fonction va bien modifier une variable extérieure à elle-même via son return.
x = fonc(a1, a2);
x sera bien modifié par fonc().
Edit : au passage, un développeur choisira clairement, pour ce type de traitement (un traitement mathématique), de passer par une fonction plutôt que de s'emmerder avec une procédure à base de pointeurs, bien plus risquée et moins intuitive à comprendre
Marsh Posté le 28-02-2018 à 21:02:48
Je pense que le prof joue un peu sur les mots dans un but pédagogique : un pointeur modifie la variable dans une procédure, une variable non pointée peut etre retournée par une fonction. Mais oui en pratique après je pense qu'on fait bien comme on veut.
Marsh Posté le 28-02-2018 à 23:45:57
Moi, ce genre d'exo, ça me fait un peu halluciner vu le hors sujet de certaines parties de la question: A la base, la différence entre procédure et fonction, c'est que, dans les bons cas, une fonction permet de faire de la composition de fonctions (et en particulier de la récursivité optimisable en renvoyant une valeur de retour qui est un appel a elle même), et pas une procédure.
En l’occurrence, comme on n'a qu'un seul truc a faire, que ce soit une procédure ou une fonction, on s'en cogne un peu beaucoup...
Citation : ''Puisque le traitement demandé ne correspond pas à une évaluation mais à la modification de la valeur d’une variable externe à la fonction C en question, il s’agit ici de concevoir une « procédure » et non une « fonction »'' |
Ben non, j'ai parfaitement le droit de faire une fonction et ne rien faire de la valeur retournée. C'est pas optimal certes, mais pas faux du tout.
on peut même s'amuser à faire:
int f(int *x, int y) {
*x *= y;
return *x;
}
...
int a, b;
...
a = f(&a, b);
A+,
Marsh Posté le 28-02-2018 à 23:50:08
rufo a écrit : En fait, si, la fonction va bien modifier une variable extérieure à elle-même via son return. |
Mais pour reprendre les termes de l'énoncé, après l’exécution, la variable x extérieure à la fonction C n'aura pas sa valeur d’origine multipliée par la valeur de y. La variable x extérieure à la fonction C aura sa valeur d’origine multipliée par la valeur de y après l'exécution et l'assignation...
A+,
Marsh Posté le 01-03-2018 à 10:17:42
Je suis désolé, l'étape *x *= y; dans la procédure est bien une multiplication suivie d'une affectation
Marsh Posté le 01-03-2018 à 18:12:11
Ah je pensais que tu parlais de ceci ou on a une vraie fonction sans effets de bord (donc bien préférable):
int f(int x, int y) {
return (x*y);
}
...
int a, b;
...
a = f(a, b);
Mille Zexcuses si je n'avais pas bien interprété tes propos.
A+,
Marsh Posté le 01-03-2018 à 23:05:23
Pas de soucis
Marsh Posté le 27-02-2018 à 23:25:29
Bonjour,
Pouvez vous m'aider à comprendre la solution de cet exercice?
''Ecrire une fonction C appelée Q2 qui réalise la modification de la valeur d’une variable x de type int en la multipliant par une valeur y. C’est-à-dire une fonction ou une procédure (à vous d’en juger) qui prend en entrées deux arguments a1 et a2, où a1 correspond à x, et a2 correspond à y, et de telle sorte qu’après l’exécution, la variable x extérieure à la fonction C ait sa valeur d’origine multipliée par la valeur de y. Vous donnerez la forme d’un appel de cette fonction C.''
la réponse donnée est :
''Puisque le traitement demandé ne correspond pas à une évaluation mais à la modification de la valeur d’une variable externe à la fonction C en question, il s’agit ici de concevoir une « procédure » et non une « fonction »''
Le corigé de cet exercice déclare la fonction écrite comme une procédure comme étant la seule réponse, avec pointeur en paramètre, mais moi je ne vois pas en quoi une fonction ne pourrait pas modifier la valeur du premier argument passé, comme dans cette fonction :
int Q2(int a1, int a2)
/* specif. : multiplie par a2 la valeur de la variable a1. */
{ a1 = a1 * a2;
return a1;}
avec une initialisation et un appel de fonction tel que celui-ci par exemple :
int a1 = 5, a2 = 2;
a1 = Q2(a1, a2);