j'ai une question qui me laisse perplexe au sujet
de l'encodage des caractères.
j'ai fait une fonction qui est capable
d'afficher correctement (en openGL) une chaine
du code ascii complet jusqu'à 255.
pour que ça fonctionne elle est déclarée comme ça :
void mafonct(unsigned char * s);
si je l'appelle avec une chaine "en dur", comme ça :
mafonct("ça me prend la tête");
pas de warning et
ça fonctionne bien chez moi (XP codeblocks gcc -W -Wall),
mais qu'en est-il de la portabilité ?
quel problème peuvent se poser en compilant ça ailleur ?
c'est quoi le type d'une chaine constante passée comme
ça ?
Je maintiens: la chaîne n'a que 3 caractères. Si tu veux parler des 8 caractères, il faut parler de tableau, pas de chaîne, qui par définition se termine par le caractère nul. Si on commence à modifier les définitions standard, on ne s'y retrouve plus...
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
Je maintiens: la chaîne n'a que 3 caractères. Si tu veux parler des
8 caractères, il faut parler de tableau, pas de chaîne, qui par
définition se termine par le caractère nul. Si on commence à modifier
les définitions standard, on ne s'y retrouve plus...
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend
aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
Je maintiens: la chaîne n'a que 3 caractères. Si tu veux parler des 8 caractères, il faut parler de tableau, pas de chaîne, qui par définition se termine par le caractère nul. Si on commence à modifier les définitions standard, on ne s'y retrouve plus...
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
Mickaël Wolff
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
En news:46d7ca69$0$405$, Mickaël Wolff va escriure:
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
Ce n'est pas une convention, c'est une norme.
En l'occurence, ce sont DEUX normes, et il se trouve qu'elles ne sont pas complètement compatibles entre elles.
Soit tu implémentes l'une, soit tu implémentes l'autre (ou tu tes restreint à l'intersection des deux, c'est plus facile).
Mais si tu veux par exemple utiliser le langage C pour manipuler des chaînes (au sens français du mot, pas au sens donné par la norme C) de caractères ASCII _y compris le caractère NUL_, tu ne peux plus utiliser les facilités de la bibliothèque standard, fonctions str*() de <string.h>, printf("%s"... et compagnie, et tu es obligé de faire à la mimine.
Ce qui n'a rien d'impossible, il suffit de voir tous les logiciels de communication qui savent parfaitement gérer cela.
Antoine
[ Merci d'éviter UTF-8 dans les news. ]
En news:46d7ca69$0$405$426a74cc@news.free.fr, Mickaël Wolff va escriure:
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend
aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
Ce n'est pas une convention, c'est une norme.
En l'occurence, ce sont DEUX normes, et il se trouve qu'elles ne sont pas
complètement compatibles entre elles.
Soit tu implémentes l'une, soit tu implémentes l'autre (ou tu tes restreint
à l'intersection des deux, c'est plus facile).
Mais si tu veux par exemple utiliser le langage C pour manipuler des chaînes
(au sens français du mot, pas au sens donné par la norme C) de caractères
ASCII _y compris le caractère NUL_, tu ne peux plus utiliser les facilités
de la bibliothèque standard, fonctions str*() de <string.h>, printf("%s"...
et compagnie, et tu es obligé de faire à la mimine.
Ce qui n'a rien d'impossible, il suffit de voir tous les logiciels de
communication qui savent parfaitement gérer cela.
En news:46d7ca69$0$405$, Mickaël Wolff va escriure:
Ça, c'est une convention en C. Mais de l'ascii "complet", ça comprend aussi le caractère 0, qui s'appelle NUL, et qui ne fait rien.
Ce n'est pas une convention, c'est une norme.
En l'occurence, ce sont DEUX normes, et il se trouve qu'elles ne sont pas complètement compatibles entre elles.
Soit tu implémentes l'une, soit tu implémentes l'autre (ou tu tes restreint à l'intersection des deux, c'est plus facile).
Mais si tu veux par exemple utiliser le langage C pour manipuler des chaînes (au sens français du mot, pas au sens donné par la norme C) de caractères ASCII _y compris le caractère NUL_, tu ne peux plus utiliser les facilités de la bibliothèque standard, fonctions str*() de <string.h>, printf("%s"... et compagnie, et tu es obligé de faire à la mimine.
Ce qui n'a rien d'impossible, il suffit de voir tous les logiciels de communication qui savent parfaitement gérer cela.
Antoine
Antoine Leca
En news:, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal, c'est juste que les implémentations les plus courantes (TurboPascal/Delphi et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
En pascal, c'est un entier sur 8 bits, donc les chaines font 255 caractères maximum, et 0 au minimum.
Pas toujours. C'était vrai aux temps du 16 bits et de la mémoire limitée, mais aujourd'hui la version 32 bits de ObjectPascal (Delphi) utilise un compte sur 32 bits. Dans le même genre, les chaînes du noyau NT (avec les caractères encodés en UTF-16) sont précédées de deux comptes, la longueur allouée et la longueur actuelle, et ces comptes sont sur 16 bits, donc 32765 caractères (codepoints, en fait) au maximum.
Antoine
En news:op.txvx94ycekgiup@localhost.localdomain, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous
forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal,
c'est juste que les implémentations les plus courantes (TurboPascal/Delphi
et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
En pascal, c'est un entier sur 8 bits, donc les chaines font
255 caractères maximum, et 0 au minimum.
Pas toujours. C'était vrai aux temps du 16 bits et de la mémoire limitée,
mais aujourd'hui la version 32 bits de ObjectPascal (Delphi) utilise un
compte sur 32 bits. Dans le même genre, les chaînes du noyau NT (avec les
caractères encodés en UTF-16) sont précédées de deux comptes, la longueur
allouée et la longueur actuelle, et ces comptes sont sur 16 bits, donc 32765
caractères (codepoints, en fait) au maximum.
Il faut faire des chaines "pascal" (la longueur est indiquée sous forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal, c'est juste que les implémentations les plus courantes (TurboPascal/Delphi et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
En pascal, c'est un entier sur 8 bits, donc les chaines font 255 caractères maximum, et 0 au minimum.
Pas toujours. C'était vrai aux temps du 16 bits et de la mémoire limitée, mais aujourd'hui la version 32 bits de ObjectPascal (Delphi) utilise un compte sur 32 bits. Dans le même genre, les chaînes du noyau NT (avec les caractères encodés en UTF-16) sont précédées de deux comptes, la longueur allouée et la longueur actuelle, et ces comptes sont sur 16 bits, donc 32765 caractères (codepoints, en fait) au maximum.
Antoine
Erwan David
"Antoine Leca" écrivait :
En news:, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal, c'est juste que les implémentations les plus courantes (TurboPascal/Delphi et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
Tout à fait, dans la norme Pascal, une chaîne n'est qu'un "PACKED ARRAY of CHAR".
En news:op.txvx94ycekgiup@localhost.localdomain, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous
forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal,
c'est juste que les implémentations les plus courantes (TurboPascal/Delphi
et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
Tout à fait, dans la norme Pascal, une chaîne n'est qu'un "PACKED ARRAY
of CHAR".
Il faut faire des chaines "pascal" (la longueur est indiquée sous forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal, c'est juste que les implémentations les plus courantes (TurboPascal/Delphi et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
Tout à fait, dans la norme Pascal, une chaîne n'est qu'un "PACKED ARRAY of CHAR".
Parler de chaînes Java aurait été plus correct.
-- Erwan
PulkoMandy
Le Fri, 31 Aug 2007 15:17:18 +0200, Erwan David a écrit:
"Antoine Leca" écrivait :
En news:, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal, c'est juste que les implémentations les plus courantes (TurboPascal/Delphi et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
Tout à fait, dans la norme Pascal, une chaîne n'est qu'un "PACKED ARRAY of CHAR".
Parler de chaînes Java aurait été plus correct.
J'aurais aussi pu dire Amstrad-Loccomotive BASIC, mais c'est moins connu :)
Le Fri, 31 Aug 2007 15:17:18 +0200, Erwan David <erwan@rail.eu.org> a
écrit:
En news:op.txvx94ycekgiup@localhost.localdomain, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous
forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage
Pascal,
c'est juste que les implémentations les plus courantes
(TurboPascal/Delphi
et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce
langage.
Tout à fait, dans la norme Pascal, une chaîne n'est qu'un "PACKED ARRAY
of CHAR".
Parler de chaînes Java aurait été plus correct.
J'aurais aussi pu dire Amstrad-Loccomotive BASIC, mais c'est moins connu :)
Le Fri, 31 Aug 2007 15:17:18 +0200, Erwan David a écrit:
"Antoine Leca" écrivait :
En news:, PulkoMandy va escriure:
Il faut faire des chaines "pascal" (la longueur est indiquée sous forme d'entier quelque part,
C'est une solution ; mais je note qu'elle n'est pas liée au langage Pascal, c'est juste que les implémentations les plus courantes (TurboPascal/Delphi et MacOS-le-vrai, et peut-être leur ancêtre UCSD) sont liés à ce langage.
Tout à fait, dans la norme Pascal, une chaîne n'est qu'un "PACKED ARRAY of CHAR".
Parler de chaînes Java aurait été plus correct.
J'aurais aussi pu dire Amstrad-Loccomotive BASIC, mais c'est moins connu :)