Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Portabilité chaine

16 réponses
Avatar
Stephane Legras-Decussy
bonjour,

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 ?

Merci !

6 réponses

1 2
Avatar
PulkoMandy
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.

Avatar
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.


Ce n'est pas une convention, c'est une norme.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
Antoine Leca
[ Merci d'éviter UTF-8 dans les news. ]

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


Avatar
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

Avatar
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".

Parler de chaînes Java aurait été plus correct.

--
Erwan


Avatar
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 :)



1 2