Samuel Krempp writes:le Sunday 22 August 2004 19:35, écrivit :Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi quelque
chose du genre « table[ ch - CHAR_MIN ] » serait plus dangéreux que
d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ?
Alors j'imagine que ce CHAR_MIN est de type int
Pourquoi ?
Il me semble que CHAR_MIN est bien de type « char ». Non ?
Samuel Krempp <krempp@crans.truc.en.trop.ens-cachan.fr> writes:
le Sunday 22 August 2004 19:35, kanze@gabi-soft.fr écrivit :
Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi quelque
chose du genre « table[ ch - CHAR_MIN ] » serait plus dangéreux que
d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ?
Alors j'imagine que ce CHAR_MIN est de type int
Pourquoi ?
Il me semble que CHAR_MIN est bien de type « char ». Non ?
Samuel Krempp writes:le Sunday 22 August 2004 19:35, écrivit :Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi quelque
chose du genre « table[ ch - CHAR_MIN ] » serait plus dangéreux que
d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ?
Alors j'imagine que ce CHAR_MIN est de type int
Pourquoi ?
Il me semble que CHAR_MIN est bien de type « char ». Non ?
le Sunday 22 August 2004 19:35, écrivit :"Philippe Guglielmetti" writes:
|> a écrit:
|> > Il faut bien, comme minimum, que je puisse utiliser des char
|> > comme index dans un tableau.
|> Pourquoi faire?
Implémenter <ctype.h> pour commencer. Ou quelque chose de semblable,
avec ses propres classifications.
|> c'est hyper dangereux!
Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi
quelque chose du genre « table[ ch - CHAR_MIN ] » serait plus
dangéreux que d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ?
Alors j'imagine que ce CHAR_MIN est de type int (ou en tout cas qque
chose qui a au moins autant de valeurs positives que char n'a de
valeurs différentes en tout).
Au début je pensais que tu voulais dire utiliser un char *directement*
comme indice dans un tableau, alors que visiblement tu veux juste
pouvoir obtenir un indice à partir d'un char. Et ça je peux comprendre
que ça puisse servir.
J'ai l'impression qu'on a besoin de rien de plus que de pouvoir faire
un entier en soustrayant 2 chars (un peu comme pour des pointeurs) et
de connaître "le premier char".
Si on avait ça et un type char qui n'est pas intrinsèquement un type
intégral, je pense que ça éviterait pas mal de pièges possibles sans
empêcher quoi que ce soit d'utile.
le Sunday 22 August 2004 19:35, kanze@gabi-soft.fr écrivit :
"Philippe Guglielmetti" <news@dynabits.com> writes:
|> <kanze@gabi-soft.fr> a écrit:
|> > Il faut bien, comme minimum, que je puisse utiliser des char
|> > comme index dans un tableau.
|> Pourquoi faire?
Implémenter <ctype.h> pour commencer. Ou quelque chose de semblable,
avec ses propres classifications.
|> c'est hyper dangereux!
Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi
quelque chose du genre « table[ ch - CHAR_MIN ] » serait plus
dangéreux que d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ?
Alors j'imagine que ce CHAR_MIN est de type int (ou en tout cas qque
chose qui a au moins autant de valeurs positives que char n'a de
valeurs différentes en tout).
Au début je pensais que tu voulais dire utiliser un char *directement*
comme indice dans un tableau, alors que visiblement tu veux juste
pouvoir obtenir un indice à partir d'un char. Et ça je peux comprendre
que ça puisse servir.
J'ai l'impression qu'on a besoin de rien de plus que de pouvoir faire
un entier en soustrayant 2 chars (un peu comme pour des pointeurs) et
de connaître "le premier char".
Si on avait ça et un type char qui n'est pas intrinsèquement un type
intégral, je pense que ça éviterait pas mal de pièges possibles sans
empêcher quoi que ce soit d'utile.
le Sunday 22 August 2004 19:35, écrivit :"Philippe Guglielmetti" writes:
|> a écrit:
|> > Il faut bien, comme minimum, que je puisse utiliser des char
|> > comme index dans un tableau.
|> Pourquoi faire?
Implémenter <ctype.h> pour commencer. Ou quelque chose de semblable,
avec ses propres classifications.
|> c'est hyper dangereux!
Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi
quelque chose du genre « table[ ch - CHAR_MIN ] » serait plus
dangéreux que d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ?
Alors j'imagine que ce CHAR_MIN est de type int (ou en tout cas qque
chose qui a au moins autant de valeurs positives que char n'a de
valeurs différentes en tout).
Au début je pensais que tu voulais dire utiliser un char *directement*
comme indice dans un tableau, alors que visiblement tu veux juste
pouvoir obtenir un indice à partir d'un char. Et ça je peux comprendre
que ça puisse servir.
J'ai l'impression qu'on a besoin de rien de plus que de pouvoir faire
un entier en soustrayant 2 chars (un peu comme pour des pointeurs) et
de connaître "le premier char".
Si on avait ça et un type char qui n'est pas intrinsèquement un type
intégral, je pense que ça éviterait pas mal de pièges possibles sans
empêcher quoi que ce soit d'utile.
Samuel Krempp writes:le Sunday 22 August 2004 19:35, écrivit :Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi
quelque chose du genre « table[ ch - CHAR_MIN ] » serait plus
dangéreux que d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ? Alors
j'imagine que ce CHAR_MIN est de type int
Pourquoi ?
Il me semble que CHAR_MIN est bien de type « char ». Non ?
Samuel Krempp <krempp@crans.truc.en.trop.ens-cachan.fr> writes:
le Sunday 22 August 2004 19:35, kanze@gabi-soft.fr écrivit :
Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi
quelque chose du genre « table[ ch - CHAR_MIN ] » serait plus
dangéreux que d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ? Alors
j'imagine que ce CHAR_MIN est de type int
Pourquoi ?
Il me semble que CHAR_MIN est bien de type « char ». Non ?
Samuel Krempp writes:le Sunday 22 August 2004 19:35, écrivit :Utiliser le C++, c'est hyper dangéreux. Je ne vois pas pourquoi
quelque chose du genre « table[ ch - CHAR_MIN ] » serait plus
dangéreux que d'autre chose.
Quand on soustrait 2 chars, on obtient un char, non ? Alors
j'imagine que ce CHAR_MIN est de type int
Pourquoi ?
Il me semble que CHAR_MIN est bien de type « char ». Non ?
drkm wrote in messageIl me semble que CHAR_MIN est bien de type « char ». Non ?
CHAR_MIN est une macro (C...), donc sa valeur dépend du contexte ou tu
l'utilise
#define CHAR_MIN 0
char m=CHAR_MIN; // marche
long* m=CHAR_MIN; // marche aussi
en C++ on devrait utiliser std::numeric_limits<char>::min() qui
renvoie un char,
ce qui va faire:
char m=std::numeric_limits<char>::min(); // marche
long* m=std::numeric_limits<char>::min() ; // warning bienvenu
drkm <usenet.fclcxx@fgeorges.org> wrote in message
Il me semble que CHAR_MIN est bien de type « char ». Non ?
CHAR_MIN est une macro (C...), donc sa valeur dépend du contexte ou tu
l'utilise
#define CHAR_MIN 0
char m=CHAR_MIN; // marche
long* m=CHAR_MIN; // marche aussi
en C++ on devrait utiliser std::numeric_limits<char>::min() qui
renvoie un char,
ce qui va faire:
char m=std::numeric_limits<char>::min(); // marche
long* m=std::numeric_limits<char>::min() ; // warning bienvenu
drkm wrote in messageIl me semble que CHAR_MIN est bien de type « char ». Non ?
CHAR_MIN est une macro (C...), donc sa valeur dépend du contexte ou tu
l'utilise
#define CHAR_MIN 0
char m=CHAR_MIN; // marche
long* m=CHAR_MIN; // marche aussi
en C++ on devrait utiliser std::numeric_limits<char>::min() qui
renvoie un char,
ce qui va faire:
char m=std::numeric_limits<char>::min(); // marche
long* m=std::numeric_limits<char>::min() ; // warning bienvenu
CHAR_MIN est une macro (C...), donc sa valeur dépend du contexte ou
tu l'utilise
CHAR_MIN est une macro (C...), donc sa valeur dépend du contexte ou
tu l'utilise
CHAR_MIN est une macro (C...), donc sa valeur dépend du contexte ou
tu l'utilise
Dans ces cas-là, on utilise ou bien les « signed char » ou bien les
«@unsigned char », pas les char tout court. Mais il existe bien des
cas où ce qu'on veut, c'est que l'indice soit un char -- un espèce
de std::map< char, quelqueChose >, pour ainsi dire. Et imposer un
std::map quand un simple tableau ferait l'affaire... (Sans parler du
fait que std::map, aussi impose un ordre.)
Un autre cas, en passant... Comment est-ce que tu écriras une fonction
d'hachage sans l'arithmétique sur des char's ?
Dans ces cas-là, on utilise ou bien les « signed char » ou bien les
«@unsigned char », pas les char tout court. Mais il existe bien des
cas où ce qu'on veut, c'est que l'indice soit un char -- un espèce
de std::map< char, quelqueChose >, pour ainsi dire. Et imposer un
std::map quand un simple tableau ferait l'affaire... (Sans parler du
fait que std::map, aussi impose un ordre.)
Un autre cas, en passant... Comment est-ce que tu écriras une fonction
d'hachage sans l'arithmétique sur des char's ?
Dans ces cas-là, on utilise ou bien les « signed char » ou bien les
«@unsigned char », pas les char tout court. Mais il existe bien des
cas où ce qu'on veut, c'est que l'indice soit un char -- un espèce
de std::map< char, quelqueChose >, pour ainsi dire. Et imposer un
std::map quand un simple tableau ferait l'affaire... (Sans parler du
fait que std::map, aussi impose un ordre.)
Un autre cas, en passant... Comment est-ce que tu écriras une fonction
d'hachage sans l'arithmétique sur des char's ?
Michel Michaud wrote in message
iM8Wc.6741$Dans news:,Un autre cas, en passant... Comment est-ce que tu écriras une
fonction d'hachage sans l'arithmétique sur des char's ?
je pourrai même choisir la valeur numérique associée à chaque
lettre c et obtenue par MES_LETTRES.find(c) !
houla... j'ai des craintes pour la performance...
je maintiens que considérer char comme un entier est un héritage
malencontrueux du C.
Les différences d'implémentation rendent ceci difficile à maintenir,
voire dangereux (James, ton hachage devra être testé sur différents
OS, en Unicode etc).
En C++, il existe static_cast et reinterpret_cast ou le bon vieux cast
a parenthèses du C qui permettrait de considérer char (et bool) comme
un type non-entier, voire une classe, et d'accéder à leur
représentation si besoin. Mais plus de manière transparente, c'est
trop dangereux.
Entre parenthèses, depuis que les int ont 32 bits comme les long (qui
devraient passer à 64, logiquement...), que les shorts en ont 16, et
que wchar_t grignote le bon vieux char à coups de macros cryptiques
pour la "portabilité",
il nous faut un vrai "byte" pour la table de hachage de James.
Les JAVAistes doivent bien se foutre de notre gueule s'ils lisent
ceci.
Michel Michaud <mm@gdzid.com> wrote in message
iM8Wc.6741$DG.153790@news20.bellglobal.com
Dans news:m2fz6fgji0.fsf@lns-vlq-28-82-254-73-1.adsl.proxad.net,
Un autre cas, en passant... Comment est-ce que tu écriras une
fonction d'hachage sans l'arithmétique sur des char's ?
je pourrai même choisir la valeur numérique associée à chaque
lettre c et obtenue par MES_LETTRES.find(c) !
houla... j'ai des craintes pour la performance...
je maintiens que considérer char comme un entier est un héritage
malencontrueux du C.
Les différences d'implémentation rendent ceci difficile à maintenir,
voire dangereux (James, ton hachage devra être testé sur différents
OS, en Unicode etc).
En C++, il existe static_cast et reinterpret_cast ou le bon vieux cast
a parenthèses du C qui permettrait de considérer char (et bool) comme
un type non-entier, voire une classe, et d'accéder à leur
représentation si besoin. Mais plus de manière transparente, c'est
trop dangereux.
Entre parenthèses, depuis que les int ont 32 bits comme les long (qui
devraient passer à 64, logiquement...), que les shorts en ont 16, et
que wchar_t grignote le bon vieux char à coups de macros cryptiques
pour la "portabilité",
il nous faut un vrai "byte" pour la table de hachage de James.
Les JAVAistes doivent bien se foutre de notre gueule s'ils lisent
ceci.
Michel Michaud wrote in message
iM8Wc.6741$Dans news:,Un autre cas, en passant... Comment est-ce que tu écriras une
fonction d'hachage sans l'arithmétique sur des char's ?
je pourrai même choisir la valeur numérique associée à chaque
lettre c et obtenue par MES_LETTRES.find(c) !
houla... j'ai des craintes pour la performance...
je maintiens que considérer char comme un entier est un héritage
malencontrueux du C.
Les différences d'implémentation rendent ceci difficile à maintenir,
voire dangereux (James, ton hachage devra être testé sur différents
OS, en Unicode etc).
En C++, il existe static_cast et reinterpret_cast ou le bon vieux cast
a parenthèses du C qui permettrait de considérer char (et bool) comme
un type non-entier, voire une classe, et d'accéder à leur
représentation si besoin. Mais plus de manière transparente, c'est
trop dangereux.
Entre parenthèses, depuis que les int ont 32 bits comme les long (qui
devraient passer à 64, logiquement...), que les shorts en ont 16, et
que wchar_t grignote le bon vieux char à coups de macros cryptiques
pour la "portabilité",
il nous faut un vrai "byte" pour la table de hachage de James.
Les JAVAistes doivent bien se foutre de notre gueule s'ils lisent
ceci.
Attention : le mot segment a une signification en dehors de Intel. Les
compilateurs et les éditeurs de Unix ont toujours geré les segments :
text, data, bss et stack. Je crois que l'utilisation du mot en Windows
moderne s'inspire plus de Unix que de Intel.
Oui, en fait, que ce soit sous Unix ou sous Windows, un segment est
|> J'ai eu à expliquer que l'adresse d'une variable est une constante
|> symbolique connue à la compilation, ce n'est pas absolument
|> immédiat. En d'autres termes que dans:
|> mov bx, @data
|> mov cx, offset VALEUR
|> "@data" et "offset VALEUR" SONT (et non pas ressemblent à) des valeurs
|> immédiates.
Tout à fait d'accord. Mais toutes les valeurs immédiates ne sont pas
connues du compilateur. Même en assembleur, @data, par exemple, pourrait
n'être fourni qu'à l'édition de liens.
Le problème, une fois que c'est pigé, est de l'expliquer. A un
Attention : le mot segment a une signification en dehors de Intel. Les
compilateurs et les éditeurs de Unix ont toujours geré les segments :
text, data, bss et stack. Je crois que l'utilisation du mot en Windows
moderne s'inspire plus de Unix que de Intel.
Oui, en fait, que ce soit sous Unix ou sous Windows, un segment est
|> J'ai eu à expliquer que l'adresse d'une variable est une constante
|> symbolique connue à la compilation, ce n'est pas absolument
|> immédiat. En d'autres termes que dans:
|> mov bx, @data
|> mov cx, offset VALEUR
|> "@data" et "offset VALEUR" SONT (et non pas ressemblent à) des valeurs
|> immédiates.
Tout à fait d'accord. Mais toutes les valeurs immédiates ne sont pas
connues du compilateur. Même en assembleur, @data, par exemple, pourrait
n'être fourni qu'à l'édition de liens.
Le problème, une fois que c'est pigé, est de l'expliquer. A un
Attention : le mot segment a une signification en dehors de Intel. Les
compilateurs et les éditeurs de Unix ont toujours geré les segments :
text, data, bss et stack. Je crois que l'utilisation du mot en Windows
moderne s'inspire plus de Unix que de Intel.
Oui, en fait, que ce soit sous Unix ou sous Windows, un segment est
|> J'ai eu à expliquer que l'adresse d'une variable est une constante
|> symbolique connue à la compilation, ce n'est pas absolument
|> immédiat. En d'autres termes que dans:
|> mov bx, @data
|> mov cx, offset VALEUR
|> "@data" et "offset VALEUR" SONT (et non pas ressemblent à) des valeurs
|> immédiates.
Tout à fait d'accord. Mais toutes les valeurs immédiates ne sont pas
connues du compilateur. Même en assembleur, @data, par exemple, pourrait
n'être fourni qu'à l'édition de liens.
Le problème, une fois que c'est pigé, est de l'expliquer. A un