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...)?
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
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"
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
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"
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!
Djoumé SALVETTI <salvetti@crans.org> 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'.
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!
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
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...