Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tableau en tant qu'argument formel

5 réponses
Avatar
Djoumé SALVETTI
Bonjour,

Dans "Le Langage C ANSI. Vers une pensée objet en JAVA" de Philippe Drix
(3ème édition) il est écrit :

,---[ (page 155) ]
| v4) version incorrecte:
| int max(int a[], int N){
| int m=*a; int i;
| for(i=0; i<N; i++){
| if (*a > m) m=*a;
| ++a; /* cette instruction est incorrecte car a est un nom de
| tableau qui intervient dans une expression; a est
| donc converti en un pointeur qui n'est pas un OBJET:
| il est donc absurde de l'incrémenter (cf XI-4.b) */
| }
| return m;
| }
`---

Or pour moi a n'est pas un nom de tableau car c'est un paramètre formel
d'une fonction, il doit donc être converti en pointeur par le
compilateur et à l'exécution de la fonction un espace mémoire est
réservé dans la pile pour stocker a.

Donc pour moi a est bien un OBJET (ou une lvalue modifiable).

Ce qui semble être confirmé par les tests que j'ai effectué et par
http://www.eskimo.com/~scs/C-faq/q6.4.html


Pour moi : int max(int a[], int N)
est strictement équivalent à : int max(int *a, int N)

Est-ce que j'ai raté quelquechose d'évident où il y a une erreur dans la
troisième édition du livre de Philippe Drix (ce qui me parait quand même
peut probable mais bon...)?

Cordialement.
--
Djoumé SALVETTI

5 réponses

Avatar
Jean-Marc Bourguet
Djoumé SALVETTI writes:

Or pour moi a n'est pas un nom de tableau car c'est un
paramètre formel d'une fonction, il doit donc être
converti en pointeur


Il n'est même pas converti. a est un pointeur. Ce qui
suit:

Pour moi : int max(int a[], int N)
est strictement équivalent à : int max(int *a, int N)


est exact.

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Emmanuel Delahaye
Djoumé SALVETTI wrote on 01/11/04 :
Dans "Le Langage C ANSI. Vers une pensée objet en JAVA" de Philippe Drix

,---[ (page 155) ]
v4) version incorrecte:
int max(int a[], int N){
int m=*a; int i;
for(i=0; i<N; i++){
if (*a > m) m=*a;
++a; /* cette instruction est incorrecte car a est un nom de
tableau qui intervient dans une expression; a est
donc converti en un pointeur qui n'est pas un OBJET:
il est donc absurde de l'incrémenter (cf XI-4.b) */
}
return m;
}
`---


Or pour moi a n'est pas un nom de tableau car c'est un paramètre formel
d'une fonction, il doit donc être converti en pointeur par le
compilateur et à l'exécution de la fonction un espace mémoire est
réservé dans la pile pour stocker a.

Donc pour moi a est bien un OBJET (ou une lvalue modifiable).


C'est vrai. Confusion classique pointeur/tableau...

char a[10] : 'a' est un tableau, donc non modifiable.

int f(char a[10]) : 'a' est un pointeur, donc modifiable.

Ceci dit, comme je dis souvent, modifier la valeur d'un paramètre est
souvent le signe d'une erreur de conception (j'aurais mis a[i]), donc
la remarque n'est pas dénuée de raison. Par contre, l'argument avancé
est fallacieux et entretient la confusion pointeur / tableau...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
Horst Kraemer
Djoumé SALVETTI wrote:

Bonjour,

Dans "Le Langage C ANSI. Vers une pensée objet en JAVA" de Philippe Drix

,---[ (page 155) ]
| v4) version incorrecte:
| int max(int a[], int N){
| int m=*a; int i;
| for(i=0; i<N; i++){
| if (*a > m) m=*a;
| ++a; /* cette instruction est incorrecte car a est un nom de
| tableau qui intervient dans une expression; a est
| donc converti en un pointeur qui n'est pas un OBJET:
| il est donc absurde de l'incrémenter (cf XI-4.b) */
| }
| return m;
| }
`---


Mauvais livre. Changer livre. L'auteur n'a pas compris que le type de
'a' est déjà (int*) avant l'usage de 'a' dans l'expression '++a'.

--
Horst

--
Lâche pas la patate!

Avatar
Djoumé SALVETTI
Mauvais livre. Changer livre. L'auteur n'a pas compris que le type de
'a' est déjà (int*) avant l'usage de 'a' dans l'expression '++a'.


Ok, merci pour vos réponses, je suis quand même surpris de trouver ce
genre d'erreur dans un bouquin aussi célèbre...

--
Djoumé SALVETTI

Avatar
Marc Boyer
In article , Djoumé SALVETTI wrote:
Mauvais livre. Changer livre. L'auteur n'a pas compris que le type de
'a' est déjà (int*) avant l'usage de 'a' dans l'expression '++a'.


Ok, merci pour vos réponses, je suis quand même surpris de trouver ce
genre d'erreur dans un bouquin aussi célèbre...


Si je voulais me faire des amis, je ferais la liste des erreurs
dans les bouquins de C dénoncées sur fclc.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.