Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ? Tu peux expliquer pourquoi le premier code a un comportement indéfini ?
-- Vincent
Gabriel Dos Reis
"Vincent Lascaux" writes:
| > > std::string encode(&buffer[0],&buffer[file_size]); | > | > Dans prèsque tous les cas, ça marche. Mais c'est un comportement | > indéfini quand même. Essaie : | > | > std::string encode( buffer, buffer + file_size ) ; | > | > (qui lui est garantie par la norme). | | Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
Pas en C++.
-- Gaby
"Vincent Lascaux" <nospam@nospam.org> writes:
| > > std::string encode(&buffer[0],&buffer[file_size]);
| >
| > Dans prèsque tous les cas, ça marche. Mais c'est un comportement
| > indéfini quand même. Essaie :
| >
| > std::string encode( buffer, buffer + file_size ) ;
| >
| > (qui lui est garantie par la norme).
|
| Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
| > > std::string encode(&buffer[0],&buffer[file_size]); | > | > Dans prèsque tous les cas, ça marche. Mais c'est un comportement | > indéfini quand même. Essaie : | > | > std::string encode( buffer, buffer + file_size ) ; | > | > (qui lui est garantie par la norme). | | Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
Pas en C++.
-- Gaby
Michel Michaud
Dans le message ,
"Vincent Lascaux" writes:
Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
Pas en C++.
Et ce, même si BS l'utilise toujours dans son livre (je lui avais fait la remarque et il était un peu faché je crois que ce soit vraiment le cas -- après vérification auprès des spécialistes de la norme--, mais il ne voulait pas introduire l'arithmétique de pointeur avant son exemple). Il y a une explication complète sur son site...
(N.B. Il ne me reste qu'à lire 224 messages avant de reprendre tout mon retard sur fclc++... je vais y arriver :-))
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Dans le message m3sm55m9b1.fsf@uniton.integrable-solutions.net,
"Vincent Lascaux" <nospam@nospam.org> writes:
Je croyais que &buffer[i] valait forcément buffer+i (si buffer est
un T[]) ?
Pas en C++.
Et ce, même si BS l'utilise toujours dans son livre (je lui avais
fait la remarque et il était un peu faché je crois que ce soit
vraiment le cas -- après vérification auprès des spécialistes de la
norme--, mais il ne voulait pas introduire l'arithmétique de pointeur
avant son exemple). Il y a une explication complète sur son site...
(N.B. Il ne me reste qu'à lire 224 messages avant de reprendre tout
mon retard sur fclc++... je vais y arriver :-))
--
Michel Michaud mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
Pas en C++.
Et ce, même si BS l'utilise toujours dans son livre (je lui avais fait la remarque et il était un peu faché je crois que ce soit vraiment le cas -- après vérification auprès des spécialistes de la norme--, mais il ne voulait pas introduire l'arithmétique de pointeur avant son exemple). Il y a une explication complète sur son site...
(N.B. Il ne me reste qu'à lire 224 messages avant de reprendre tout mon retard sur fclc++... je vais y arriver :-))
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
C'est vrai pour une définition limitée de valoir. Si les deux expressions sont valable, elles se valent.
Tu peux expliquer pourquoi le premier code a un comportement indéfini ?
Parce que l'expression buffer[file_size] déréférence un derrier la fin du tableau, et qu'elle a donc un comportement indéfini. Et que quoique tu en fasses ensuite ne peut enlever ce comportement indéfini.
Note qu'en C99, ils ont modifié la définition de l'opérateur [], pour que son comportement dépend de ce qu'on en fait avec le résultat. Ce qui poserait un réel problème en cas de surcharge par l'utilisateur.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Je croyais que &buffer[i] valait forcément buffer+i (si buffer
est un T[]) ?
C'est vrai pour une définition limitée de valoir. Si les deux
expressions sont valable, elles se valent.
Tu peux expliquer pourquoi le premier code a un comportement
indéfini ?
Parce que l'expression buffer[file_size] déréférence un derrier
la fin du tableau, et qu'elle a donc un comportement indéfini.
Et que quoique tu en fasses ensuite ne peut enlever ce
comportement indéfini.
Note qu'en C99, ils ont modifié la définition de l'opérateur [],
pour que son comportement dépend de ce qu'on en fait avec le
résultat. Ce qui poserait un réel problème en cas de surcharge
par l'utilisateur.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Je croyais que &buffer[i] valait forcément buffer+i (si buffer est un T[]) ?
C'est vrai pour une définition limitée de valoir. Si les deux expressions sont valable, elles se valent.
Tu peux expliquer pourquoi le premier code a un comportement indéfini ?
Parce que l'expression buffer[file_size] déréférence un derrier la fin du tableau, et qu'elle a donc un comportement indéfini. Et que quoique tu en fasses ensuite ne peut enlever ce comportement indéfini.
Note qu'en C99, ils ont modifié la définition de l'opérateur [], pour que son comportement dépend de ce qu'on en fait avec le résultat. Ce qui poserait un réel problème en cas de surcharge par l'utilisateur.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34