a écrit:Il faut bien, comme minimum,
que je puisse utiliser des char comme index dans un tableau.
Pourquoi faire? c'est hyper dangereux!
Tu penses comme un C-iste pour qui il y a un "typedef unsigned short int
char;" quelque part...
AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
<kanze@gabi-soft.fr> a écrit:
Il faut bien, comme minimum,
que je puisse utiliser des char comme index dans un tableau.
Pourquoi faire? c'est hyper dangereux!
Tu penses comme un C-iste pour qui il y a un "typedef unsigned short int
char;" quelque part...
AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
a écrit:Il faut bien, comme minimum,
que je puisse utiliser des char comme index dans un tableau.
Pourquoi faire? c'est hyper dangereux!
Tu penses comme un C-iste pour qui il y a un "typedef unsigned short int
char;" quelque part...
AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
"Philippe Guglielmetti" writes:AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
Un char est un entier. C'est comme ça.
"Philippe Guglielmetti" <news@dynabits.com> writes:
AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
Un char est un entier. C'est comme ça.
"Philippe Guglielmetti" writes:AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
Un char est un entier. C'est comme ça.
drkm writes:"Philippe Guglielmetti" writes:AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']Un char est un entier. C'est comme ça.
Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
litéral caractère. Ne serait-ce que pour le problème signé ou non.
Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
suppose qu'il s'agit du cas général de sortie des bornes du tableau.
drkm <usenet.fclcxx@fgeorges.org> writes:
"Philippe Guglielmetti" <news@dynabits.com> writes:
AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']
Un char est un entier. C'est comme ça.
Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
litéral caractère. Ne serait-ce que pour le problème signé ou non.
Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
suppose qu'il s'agit du cas général de sortie des bornes du tableau.
drkm writes:"Philippe Guglielmetti" writes:AMHA (à mon humble avis...), tableau['x'] devrait être interdit en C++,
surtout depuis que 'é'
n'a pas la même valeur selon les OS, et encore plus depuis Unicode.
Le bidouilleur nostalgique peut toujours faire tableau[(unsigned short)'x']Un char est un entier. C'est comme ça.
Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
litéral caractère. Ne serait-ce que pour le problème signé ou non.
Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
suppose qu'il s'agit du cas général de sortie des bornes du tableau.
drkm wrote:drkm writes:Un char est un entier. C'est comme ça.
Dans l'idéal, je dirais que signed char ou unsigned char sont des
entiers, et char est un caractère. Mais on n'est pas dans un monde
idéal.
Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
litéral caractère. Ne serait-ce que pour le problème signé ou non.
Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
suppose qu'il s'agit du cas général de sortie des bornes du tableau.
Pas forcément :
int main()
{
char toto[] = "Hello world";
char *world = toto+6;
cout << world[-2] << "=='o'" << endl;
}
drkm wrote:
drkm <usenet.fclcxx@fgeorges.org> writes:
Un char est un entier. C'est comme ça.
Dans l'idéal, je dirais que signed char ou unsigned char sont des
entiers, et char est un caractère. Mais on n'est pas dans un monde
idéal.
Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
litéral caractère. Ne serait-ce que pour le problème signé ou non.
Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
suppose qu'il s'agit du cas général de sortie des bornes du tableau.
Pas forcément :
int main()
{
char toto[] = "Hello world";
char *world = toto+6;
cout << world[-2] << "=='o'" << endl;
}
drkm wrote:drkm writes:Un char est un entier. C'est comme ça.
Dans l'idéal, je dirais que signed char ou unsigned char sont des
entiers, et char est un caractère. Mais on n'est pas dans un monde
idéal.
Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
litéral caractère. Ne serait-ce que pour le problème signé ou non.
Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
suppose qu'il s'agit du cas général de sortie des bornes du tableau.
Pas forcément :
int main()
{
char toto[] = "Hello world";
char *world = toto+6;
cout << world[-2] << "=='o'" << endl;
}
Un autre cas, en passant... Comment est-ce que tu écriras une
fonction d'hachage sans l'arithmétique sur des char's ?
Un autre cas, en passant... Comment est-ce que tu écriras une
fonction d'hachage sans l'arithmétique sur des char's ?
Un autre cas, en passant... Comment est-ce que tu écriras une
fonction d'hachage sans l'arithmétique sur des char's ?
drkm writes:
|> drkm writes:
|> > "Philippe Guglielmetti" writes:
|> >> AMHA (à mon humble avis...), tableau['x'] devrait être interdit
|> >> en C++, surtout depuis que 'é' n'a pas la même valeur selon les
|> >> OS, et encore plus depuis Unicode. Le bidouilleur nostalgique
|> >> peut toujours faire tableau[(unsigned short)'x']
|> > Un char est un entier. C'est comme ça.
|> Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
|> litéral caractère. Ne serait-ce que pour le problème signé ou non.
|> Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
|> moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
|> suppose qu'il s'agit du cas général de sortie des bornes du tableau.
Dis donc. Tu fréquentes ce groupe assez longtemps pour me connaître
mieux que ça. L'indice réele du tableau, c'est toujours ch - CHAR_MIN.
drkm <usenet.fclcxx@fgeorges.org> writes:
|> drkm <usenet.fclcxx@fgeorges.org> writes:
|> > "Philippe Guglielmetti" <news@dynabits.com> writes:
|> >> AMHA (à mon humble avis...), tableau['x'] devrait être interdit
|> >> en C++, surtout depuis que 'é' n'a pas la même valeur selon les
|> >> OS, et encore plus depuis Unicode. Le bidouilleur nostalgique
|> >> peut toujours faire tableau[(unsigned short)'x']
|> > Un char est un entier. C'est comme ça.
|> Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
|> litéral caractère. Ne serait-ce que pour le problème signé ou non.
|> Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
|> moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
|> suppose qu'il s'agit du cas général de sortie des bornes du tableau.
Dis donc. Tu fréquentes ce groupe assez longtemps pour me connaître
mieux que ça. L'indice réele du tableau, c'est toujours ch - CHAR_MIN.
drkm writes:
|> drkm writes:
|> > "Philippe Guglielmetti" writes:
|> >> AMHA (à mon humble avis...), tableau['x'] devrait être interdit
|> >> en C++, surtout depuis que 'é' n'a pas la même valeur selon les
|> >> OS, et encore plus depuis Unicode. Le bidouilleur nostalgique
|> >> peut toujours faire tableau[(unsigned short)'x']
|> > Un char est un entier. C'est comme ça.
|> Mais je suis d'accord pour avertir sur l'indiçage au moyen d'un
|> litéral caractère. Ne serait-ce que pour le problème signé ou non.
|> Tiens, au fait, que se passe-t-il dans l'indiçage d'un tableau au
|> moyen d'un entier négatif ? Comportement indéfini, j'imagine ; je
|> suppose qu'il s'agit du cas général de sortie des bornes du tableau.
Dis donc. Tu fréquentes ce groupe assez longtemps pour me connaître
mieux que ça. L'indice réele du tableau, c'est toujours ch - CHAR_MIN.
a écrit:Falk Tannhäuser wrote in message
news:<cg2lso$tee$...Fabien LE LEZ wrote:Existe-t-il une combine pour empêcher C++ de compiler des bêtises
à la C ?
A priori, non. Mais il n'est pas impossible que certains compilos
génèrent un warning (modulo l'option qui va bien).
Avec 'gcc -Wall', j'ai bien un warning "array subscript has type `char'"
quand je fais
std::string bad = &'x'["yz"];
(qui est fonctionellement équivalent à
std::string bad = 'x' + "yz";
mais il me ne semble pas avoir de moyen pour faire générer un
warning dans ce cas)
On pourrait générer un avertissement chaque fois que le programmeur
essaie d'utiliser un char comme un petit entier:-). Le problème alors
sera, comment trouver les avertissements « intéressants » parmi
l'inondation.
1: const char offset_nom = sizeof("Pierre");// / sizeof(char);
2: std::string pluriel_debile = "Automobile" + 's';
3: std::string nom_prenom = "Pierre Maurette";
4: std::string mon_nom0 = offset_nom + "Pierre Maurette";
5: std::string mon_nom1 = offset_nom + nom_prenom.c_str();
Tout ça sans ouharning (gcc 3.3.1, -Wall, et VC7.1).
Si l'on considère que tous mes compilos me préviennent quand je fais:
if(ptr = fonction_qui_renvoie_un_pointeur()){...}
et logiquement se taisent avec:
if((ptr = fonction_qui_renvoie_un_pointeur()) != NULL){...}
le ligne 2 sent également la faute de frappe ou l'erreur de débutant à
plein nez. Elle mériterait un warning.
En fait, je préfèrerais une classe string qui refuse la ligne 2 et qui
accepte:
NouvelleString pluriel_debile = "Automobile" + "s";
La ligne 3 me convient parfaitement. Alors que je me demandais si elle
était légale ;-)
La ligne 4 est à mon sens débile. Il faudrait au moins avertir (même
dans ce cas, où le compilo peut savoir que rien de fâcheux ne va se
passer). Si l'on veut faire du C, les classes string ont prévu ce
qu'il faut (ligne 5).
Et ce qui me déçoit, c'est que l'AnsiString de la VCL Borland a le
même comportement que std::string sur ce point. En revanche, Delphi et
la même VCL autorisent logiquement:
var
Test: AnsiString;
begin
Test := 'Pierre '+ 'Maurette';
La différence est facilement explicable, mais c'est chiant.
Dans ce cas particulier, l'arithmétique ne comporte que des
constantes (un pointeur constant et un entier constant). Or, tous les
compilateurs que je connais font du « constant folding », c-à-d
qu'ils évaluent l'expression lors de la compilation, et non à
l'exécution. C'est un peu plus complex quand il y a un pointeur,
évidemment, parce que constante ou non, l'adresse exacte finale n'est
pas connue du compilateur.
Oui. Je pense que le compilateur connaît toutes les adresses des
données initialisées (ou même non initialisées) au pire à une
constante près, déterminée par le lieur puis le chargeur.
On peut donc affirmer qu'il a tous les éléments nécessaires et le
programmeur peut considérer ces adresses comme des constantes connues
à la compilation.
int* ptr = &MaVar;
génère un truc du genre de ce qu'on peut faire directement en
assembleur:
mov eax, offset MaVar
offset MaVar est une constante immédiate, en tous cas se retrouvera
sous cette forme dans l'executable en mémoire (pas nécessairement dans
le point exe sur le disque).
Et il me semble que sur les archis que je connais (en fait, une seule,
ou à peu près :-() les choses sont encore plus simples, le travail du
lieur et du chargeur se réduit à positionner la valeur de segments ou
leurs descripteurs. Ainsi, le compilateur connait les valeurs
numériques des offset, c'est à dire des adresses.
kanze@gabi-soft.fr a écrit:
Falk Tannhäuser <falk.tannhauser@crf.canon.fr> wrote in message
news:<cg2lso$tee$1@s5.feed.news.oleane.net>...
Fabien LE LEZ wrote:
Existe-t-il une combine pour empêcher C++ de compiler des bêtises
à la C ?
A priori, non. Mais il n'est pas impossible que certains compilos
génèrent un warning (modulo l'option qui va bien).
Avec 'gcc -Wall', j'ai bien un warning "array subscript has type `char'"
quand je fais
std::string bad = &'x'["yz"];
(qui est fonctionellement équivalent à
std::string bad = 'x' + "yz";
mais il me ne semble pas avoir de moyen pour faire générer un
warning dans ce cas)
On pourrait générer un avertissement chaque fois que le programmeur
essaie d'utiliser un char comme un petit entier:-). Le problème alors
sera, comment trouver les avertissements « intéressants » parmi
l'inondation.
1: const char offset_nom = sizeof("Pierre");// / sizeof(char);
2: std::string pluriel_debile = "Automobile" + 's';
3: std::string nom_prenom = "Pierre Maurette";
4: std::string mon_nom0 = offset_nom + "Pierre Maurette";
5: std::string mon_nom1 = offset_nom + nom_prenom.c_str();
Tout ça sans ouharning (gcc 3.3.1, -Wall, et VC7.1).
Si l'on considère que tous mes compilos me préviennent quand je fais:
if(ptr = fonction_qui_renvoie_un_pointeur()){...}
et logiquement se taisent avec:
if((ptr = fonction_qui_renvoie_un_pointeur()) != NULL){...}
le ligne 2 sent également la faute de frappe ou l'erreur de débutant à
plein nez. Elle mériterait un warning.
En fait, je préfèrerais une classe string qui refuse la ligne 2 et qui
accepte:
NouvelleString pluriel_debile = "Automobile" + "s";
La ligne 3 me convient parfaitement. Alors que je me demandais si elle
était légale ;-)
La ligne 4 est à mon sens débile. Il faudrait au moins avertir (même
dans ce cas, où le compilo peut savoir que rien de fâcheux ne va se
passer). Si l'on veut faire du C, les classes string ont prévu ce
qu'il faut (ligne 5).
Et ce qui me déçoit, c'est que l'AnsiString de la VCL Borland a le
même comportement que std::string sur ce point. En revanche, Delphi et
la même VCL autorisent logiquement:
var
Test: AnsiString;
begin
Test := 'Pierre '+ 'Maurette';
La différence est facilement explicable, mais c'est chiant.
Dans ce cas particulier, l'arithmétique ne comporte que des
constantes (un pointeur constant et un entier constant). Or, tous les
compilateurs que je connais font du « constant folding », c-à-d
qu'ils évaluent l'expression lors de la compilation, et non à
l'exécution. C'est un peu plus complex quand il y a un pointeur,
évidemment, parce que constante ou non, l'adresse exacte finale n'est
pas connue du compilateur.
Oui. Je pense que le compilateur connaît toutes les adresses des
données initialisées (ou même non initialisées) au pire à une
constante près, déterminée par le lieur puis le chargeur.
On peut donc affirmer qu'il a tous les éléments nécessaires et le
programmeur peut considérer ces adresses comme des constantes connues
à la compilation.
int* ptr = &MaVar;
génère un truc du genre de ce qu'on peut faire directement en
assembleur:
mov eax, offset MaVar
offset MaVar est une constante immédiate, en tous cas se retrouvera
sous cette forme dans l'executable en mémoire (pas nécessairement dans
le point exe sur le disque).
Et il me semble que sur les archis que je connais (en fait, une seule,
ou à peu près :-() les choses sont encore plus simples, le travail du
lieur et du chargeur se réduit à positionner la valeur de segments ou
leurs descripteurs. Ainsi, le compilateur connait les valeurs
numériques des offset, c'est à dire des adresses.
a écrit:Falk Tannhäuser wrote in message
news:<cg2lso$tee$...Fabien LE LEZ wrote:Existe-t-il une combine pour empêcher C++ de compiler des bêtises
à la C ?
A priori, non. Mais il n'est pas impossible que certains compilos
génèrent un warning (modulo l'option qui va bien).
Avec 'gcc -Wall', j'ai bien un warning "array subscript has type `char'"
quand je fais
std::string bad = &'x'["yz"];
(qui est fonctionellement équivalent à
std::string bad = 'x' + "yz";
mais il me ne semble pas avoir de moyen pour faire générer un
warning dans ce cas)
On pourrait générer un avertissement chaque fois que le programmeur
essaie d'utiliser un char comme un petit entier:-). Le problème alors
sera, comment trouver les avertissements « intéressants » parmi
l'inondation.
1: const char offset_nom = sizeof("Pierre");// / sizeof(char);
2: std::string pluriel_debile = "Automobile" + 's';
3: std::string nom_prenom = "Pierre Maurette";
4: std::string mon_nom0 = offset_nom + "Pierre Maurette";
5: std::string mon_nom1 = offset_nom + nom_prenom.c_str();
Tout ça sans ouharning (gcc 3.3.1, -Wall, et VC7.1).
Si l'on considère que tous mes compilos me préviennent quand je fais:
if(ptr = fonction_qui_renvoie_un_pointeur()){...}
et logiquement se taisent avec:
if((ptr = fonction_qui_renvoie_un_pointeur()) != NULL){...}
le ligne 2 sent également la faute de frappe ou l'erreur de débutant à
plein nez. Elle mériterait un warning.
En fait, je préfèrerais une classe string qui refuse la ligne 2 et qui
accepte:
NouvelleString pluriel_debile = "Automobile" + "s";
La ligne 3 me convient parfaitement. Alors que je me demandais si elle
était légale ;-)
La ligne 4 est à mon sens débile. Il faudrait au moins avertir (même
dans ce cas, où le compilo peut savoir que rien de fâcheux ne va se
passer). Si l'on veut faire du C, les classes string ont prévu ce
qu'il faut (ligne 5).
Et ce qui me déçoit, c'est que l'AnsiString de la VCL Borland a le
même comportement que std::string sur ce point. En revanche, Delphi et
la même VCL autorisent logiquement:
var
Test: AnsiString;
begin
Test := 'Pierre '+ 'Maurette';
La différence est facilement explicable, mais c'est chiant.
Dans ce cas particulier, l'arithmétique ne comporte que des
constantes (un pointeur constant et un entier constant). Or, tous les
compilateurs que je connais font du « constant folding », c-à-d
qu'ils évaluent l'expression lors de la compilation, et non à
l'exécution. C'est un peu plus complex quand il y a un pointeur,
évidemment, parce que constante ou non, l'adresse exacte finale n'est
pas connue du compilateur.
Oui. Je pense que le compilateur connaît toutes les adresses des
données initialisées (ou même non initialisées) au pire à une
constante près, déterminée par le lieur puis le chargeur.
On peut donc affirmer qu'il a tous les éléments nécessaires et le
programmeur peut considérer ces adresses comme des constantes connues
à la compilation.
int* ptr = &MaVar;
génère un truc du genre de ce qu'on peut faire directement en
assembleur:
mov eax, offset MaVar
offset MaVar est une constante immédiate, en tous cas se retrouvera
sous cette forme dans l'executable en mémoire (pas nécessairement dans
le point exe sur le disque).
Et il me semble que sur les archis que je connais (en fait, une seule,
ou à peu près :-() les choses sont encore plus simples, le travail du
lieur et du chargeur se réduit à positionner la valeur de segments ou
leurs descripteurs. Ainsi, le compilateur connait les valeurs
numériques des offset, c'est à dire des adresses.