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

Description de strcmp dans la norme

55 réponses
Avatar
candide
Bonjour,

Deux choses me gênent dans la description de la fonction strcmp dans la
norme (C90 tout comme C99) :

1er point :

--------------------------------8<-----------------------------------
7.21.4 Comparison functions
1 The sign of a nonzero value returned by the comparison functions
memcmp, strcmp, and strncmp is determined by the sign of the difference
between the values of the first pair of characters (both interpreted as
unsigned char) that differ in the objects being compared.
-------------------------------->8-----------------------------------

Pourquoi employer l'expression "is determined" qui est assez vague
(pour moi, ici ça veut dire "est déterminé") ? Pourquoi ne pas dire
que les signes sont identiques (donc "coincides with" ou "matches" ou
"is identical to", etc) ?

2ème point :

--------------------------------8<-----------------------------------
7.21.4.2 p3 The strcmp function returns an integer greater than, equal
to, or less than zero, accordingly as the string pointed to by s1 is
greater than, equal to, or less than the string pointed to by s2.
-------------------------------->8-----------------------------------

Où dans la norme la notion de "chaîne plus grande qu'une autre" est-elle
définie ?

Merci

10 réponses

1 2 3 4 5
Avatar
candide
Antoine Leca a écrit :
En news:48966b0a$0$18200$, candide va escriure:
Le verbe "déterminer" exprime quelque chose de fort et d'important.



Non. Relis le premier alinéa de la clause 3. Ensuite recherche les
occurrences de "to determine": elles ne sont pas en italique.



Au passage, je signale que je l'avais fait, me disant, -- italiques ou
pas -- qu'il y avait peut-être un sens caché de "to be determined".

Donc le terme
n'est pas particulièrement important dans le cadre de la norme C.





Ce n'est pas le problème, remets-toi dans le contexte de la réponse que
je donnais à Richard ("chose déterminée reste indéterminée").




Si je dis z est déterminé par y et z, cela veut juste dire qu'il
existe une fonction f telle que z=f(x,y). Maintenant que
f(x,y)=sqrt(x*x+y*y) ou f(x,y)=|x|+|y| ou que sais-je encore,
ce n'est pas pareil.



Du point de vue de la détermination (ou de l'indétermination), si.



Je ne comprends pas ce que tu veux dire.

Ce que je dis c'est que la Norme n'exprime pas COMMENT le signe du
retour est lié au signe de la différence.



Le comment est le problème de l'implémenteur, et en l'occurence il a un peu
de marge de manouvre.




Bien sûr que je ne parle pas de ce sens-là, le lecteur de la norme est
en principe un utilisateur, par un implémenteur. La norme dit que le
signe de la valeur de retour est _déterminé_ par le signe de blablabla.

Je réponds : "déterminé comment ?"

parce que la spécification est incomplète. En effet, la norme ne me dit
pas _en quoi_ (ie "comment") le signe de l'un _détermine_ le signe de
l'autre : est-ce que c'est le même signe, le signe opposé, le signe
opposé sauf si le programmeur est né un 29 février, etc.



Il me semble quand même beaucoup plus précis de dire que le signe est
non seulement "déterminé" mais _identique_ au signe de la différence.



(d'équivalence celle-là)



Et alors, aucun rapport.

les auteurs ont cherché à éviter de rajouter une autre notion...



Mais absolument pas, ils ont surtout donné une définition complètement
bancale. A croire qu'ils n'ont pas voulu modifier une version historique
incorrecte et qu'ils ont rajouté des couches. Le texte contient au moins
trois "erreurs" :

1°) l'emploi de "is determined",
2°) la définition incomplète de la relation d'ordre sur les chaînes
(nulle part il n'est dit comment on les compare alors que la _valeur_
d'une chaîne, elle, est définie)
3°) le fait que des notions soient présentées sans être reliées entre
elles (ici, d'une part ce que j'ai appelé le préambule du §7.21.4.2 de
C99 et d'autre part la partie "Returns" du même paragraphe).



Qu'est-ce qui n'est pas défini dans :
- si les premiers éléments de chacune des deux suites sont différents, on
compare leurs valeurs ;
- sinon, on compare le reste des deux suites.

(et il s'agit ici d'une reformulation inférieure au texte de la norme).




Oui, j'ai bien vu, c'est dans le préambule. Où est-il affirmé que cela
définit l'ordre sur les chaînes dont il est questions plusieurs lignes
plus loin ? Comme je l'ai dit, cette notion est séparée du préambule. Le
préambule, pour sa part, il met en relation ("établit une relation
univoque" pour réutiliser ton terme) le signe d'une valeur de retour et
le signe d'une grandeur mathématique. Rien n'indique que la positivité
de cette grandeur équivaut à définir la relation d'ordre entre les chaines.



Enfin! la norme dit clairement et explicitement dans un endroit
approprié ce que c'est que la _valeur_ d'une chaîne et elle n'est pas
capable de, même pas de "dire" mais de "suggérer", autrement qu'au
détour d'une phrase ce que voudrait dire qu'une "chaîne est plus grande
qu'une autre". C'est totalement incohérent.




Il y a une autre différence : le premier est toujours dans le jeu
d'exécution, tandis que le second peut être constitué d'éléments du jeu
source.



Je ne te cache pas que les différences entre le jeu de caractères source
et le jeu de caractères d'exécution me dépassent un peu. C'est, je
trouve, une des nombreuses notions difficiles à comprendre si on s'en
tient juste à la lecture de la Norme. Mais je ne désespère pas de tirer
ça complètement au clair d'ici quelques temps.

Bon, ce que je lis en tout cas dans 5.1.1.2 ("Translation phases") de
C90, c'est que les chaînes littérales sont converties dans le jeu
d'exécution.




Alors, là je demande à comprendre la validité de ce
contre-exemple au vu des définitions données ci-dessus.



C'est typique des exemples qui font planter les compilateurs... (et par
conséquent à éviter pour les programmeurs).




OK, cette fois-ci, j'avais tort de récriminer puisque je n'avais pas
fixé mon attention sur le "first" :


"A string is a contiguous sequence of characters terminated by and
including the first null character."

Néanmoins, je trouve la formulation "including the first null character"
assez peu claire. En français, ça donnerait donc :

"Une chaîne est une suite contiguë de caractères terminée par et
incluant le premier caractère nul".

Bof. "Se terminer par le premier", je trouve ça compliqué comme façon de
formuler. Et pour plusieurs raisons que je ne vais pas toutes détailler.


Et ce n'est pas naturel d'utiliser le terme de "premier" au lieu de
"unique". Que dire de "je suis fils premier" si on n'est pas prince ... ?

J'aurais dit tout simplement :

"Une chaîne est une suite contiguë de caractères terminée par un
caractère nul et ne contenant par d'autre caractère nul."

C'est pas très joli mais c'est plus smooth pour le cerveau.

Sinon, en fait, je ne trouve pas leur définition parfaitement claire.
Ce qui me gêne, c'est cette histoire de "suite de caractères". On
n'arrive pas à savoir à quel niveau la définition se place. Il est bien
clair qu'une telle définition a un sens ailleurs que dans le contexte du
langage C. Par exemple, cette définition ne me dit pas si une chaîne est
un objet. Et une chaîne est-elle de type tableau ? Comment la définition
précédente me permet-elle de répondre à cette question ?

N'aurait-il pas été pertinent de reprendre le vocabulaire définissant un
tableau :
"An array type describes a contiguously allocated nonempty set of
objects ..."

(noter à nouveau le vague de "describes") ?

Par ailleurs, tu vois bien les différences entre un littéral en virgule
flottante et un objet de type flottant, non ?



Je sais pas ce que c'est qu'un "littéral en virgule flottante", pour
moi, comme son non l'indique, un litteral contient des lettres, mais tu
veux dire un truc du genre "3.14" ? Bien, oui, je fais bien la
différence mais je vois pas trop le rapport avec notre problème qu'une
chaîne littérale n'est pas une chaîne. Au fait, tu dis peut-être
"littéral chaîne" pour exprimer qu'un "litteral" n'est pas une "chaîne".
Pourquoi pas et ce n'est pas si mal et après tout en effet, cela
correspond bien à l'expression en anglais qui est plus un mot composé
qu'un nom adjectivé.
Avatar
Jean-Marc Desperrier
candide wrote:
Antoine Leca a écrit :
En news:48962096$0$3720$, candide va escriure:
[...]


Le préambule laisse entendre qu'il s'agit de la relation d'ordre
lexicographique



D'où tires-tu cette interprétation (nouvelle pour moi, je ne savais
pas que
z<ñ, ou encore que z<A, dans l'ordre lexicographique) ?



Là je tombe de haut.
http://fr.wikipedia.org/wiki/Ordre_lexicographique#Ordre_lexicographique_sur_des_suites_finies



Cet article manque de rigueur.
L'ordre lexicographique tel qu'il y est défini *n'est pas* l'ordre du
dictionnaire.

L'ordre du dictionnaire en français ordonne les dérivés du mot légitime
de la manière suivante, non lexicographique :
- légitime
- légitimé
- légitimement

Lorsque "(a,b)<(a,b’)", on peut avoir "(a,b’)<(a,b,c)" ce qui n'est pas
compatible avec la définition d'un tri lexicographique.
Avatar
Erwan David
Jean-Marc Desperrier écrivait :

candide wrote:
Antoine Leca a écrit :
En news:48962096$0$3720$, candide va escriure:
[...]


Le préambule laisse entendre qu'il s'agit de la relation d'ordre
lexicographique



D'où tires-tu cette interprétation (nouvelle pour moi, je ne savais
pas que
z<ñ, ou encore que z<A, dans l'ordre lexicographique) ?



Là je tombe de haut.
http://fr.wikipedia.org/wiki/Ordre_lexicographique#Ordre_lexicographique _sur_des_suites_finies



Cet article manque de rigueur.
L'ordre lexicographique tel qu'il y est défini *n'est pas* l'ordre du
dictionnaire.

L'ordre du dictionnaire en français ordonne les dérivés du mot
légitime de la manière suivante, non lexicographique :
- légitime
- légitimé
- légitimement

Lorsque "(a,b)<(a,b’)", on peut avoir "(a,b’)<(a,b,c)" ce qui n'est
pas compatible avec la définition d'un tri lexicographique.



Mais si : le dictionnaire que tu utilises considère que les
diacrituiques sont rangés avec la lettre nue. Il s'agit d'un ordre
lexicigraphique basé sur un ordre partiel des caractères.
"Un ordre lexicographique" n'est qu'un ordre dérivé d'un ordre de base
sur l'alphabet.

--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Wykaaa
Antoine Leca a écrit :
En news:48956e6b$0$945$, Wykaaa va escriure:
Par rapport à l'ordre lexicographique (codage des caractères).



Mmmm, ce n'est pas la même chose...


LEXICOGRAPHIQUE adj. XIXe siècle. Dérivé de /lexicographie/.
Relatif à la lexicographie. /Travaux lexicographiques./

LEXICOGRAPHIE n. f. XVIIIe siècle. Dérivé de /lexicographe/.
1. Science et technique de la composition et de la rédaction de lexiques,
de dictionnaires. [...]

ex. Dictionnaire de l'Académie, neuvième édition.


Antoine



Sauf à faire volontairement le naïf ou être réellement ignorant, tout
informaticien sait ce qu'est l'ordre lexicographique et ne confie pas
sont interprétation à un dictionnaire littéraire :-((
Avatar
Charlie Gordon
"Wykaaa" a écrit dans le message de news:
4899f553$0$952$
Antoine Leca a écrit :
En news:48956e6b$0$945$, Wykaaa va escriure:
Par rapport à l'ordre lexicographique (codage des caractères).



Mmmm, ce n'est pas la même chose...

LEXICOGRAPHIQUE adj. XIXe siècle. Dérivé de /lexicographie/.
Relatif à la lexicographie. /Travaux lexicographiques./

LEXICOGRAPHIE n. f. XVIIIe siècle. Dérivé de /lexicographe/.
1. Science et technique de la composition et de la rédaction de
lexiques,
de dictionnaires. [...]

ex. Dictionnaire de l'Académie, neuvième édition.



Sauf à faire volontairement le naïf ou être réellement ignorant, tout
informaticien sait ce qu'est l'ordre lexicographique et ne confie pas sont
interprétation à un dictionnaire littéraire :-((



Sauf que ce terme est particulierement mal choisi.

La signification que les informaticiens lui confèrent depuis un demi-siècle
est en contradiction avec l'éthymologie et l'usage académique que les
définitions ci-dessus démontrent. L'ordre lexicographique est littéralement
l'ordre du dictionnaire, justement pas l'ordre déterminé par les
comparaisons numériques des caractères encodés en mémoire. Il faut cesser
d'utiliser des termes aussi confus.

L'ordre que permet de définir strcmp dépend totalement de la représentation
interne des caractères choisie pour le système et l'application courante via
notamment l'encodage et le jeu de caractères.

Dans les faits, strcmp est majoritairement utilisée pour déterminer si 2
chaines ont le même contenu, avec l'un des deux idiomes ``!strcmp(a,b)'' ou
``strcmp(a,b) == 0''. C'est une chance que cette fonction ne soit pas
localisée : cela permet de lui conserver son efficacité, avec une expansion
en ligne par la plupart des compilateurs modernes. En revanche strcoll
prétend adresser la question de l'ordre "du dictionnaire" mais une
implémentation ad hoc des spécificités culturelles locales est souvent
préférable.

--
Chqrlie.
Avatar
Mickaël Wolff
Wykaaa a écrit :

Sauf à faire volontairement le naïf ou être réellement ignorant, tout
informaticien sait ce qu'est l'ordre lexicographique et ne confie pas
sont interprétation à un dictionnaire littéraire :-((



Ben non, moi je ne sais pas. C'est certainement parce que je n'ai
jamais eu de cours de théorie du langage ? Si j'en crois les
explications de Charlie, j'utilises l'anglicisme collation (miam) ou
interclassement en lieu et place de « ordre lexicographique ».

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Wykaaa
Charlie Gordon a écrit :
"Wykaaa" a écrit dans le message de news:
4899f553$0$952$
Antoine Leca a écrit :
En news:48956e6b$0$945$, Wykaaa va escriure:
Par rapport à l'ordre lexicographique (codage des caractères).


Mmmm, ce n'est pas la même chose...

LEXICOGRAPHIQUE adj. XIXe siècle. Dérivé de /lexicographie/.
Relatif à la lexicographie. /Travaux lexicographiques./

LEXICOGRAPHIE n. f. XVIIIe siècle. Dérivé de /lexicographe/.
1. Science et technique de la composition et de la rédaction de
lexiques,
de dictionnaires. [...]

ex. Dictionnaire de l'Académie, neuvième édition.



Sauf à faire volontairement le naïf ou être réellement ignorant, tout
informaticien sait ce qu'est l'ordre lexicographique et ne confie pas sont
interprétation à un dictionnaire littéraire :-((



Sauf que ce terme est particulierement mal choisi.



Oui c'est vrai, mais c'est le terme consacré par les spécialistes
langages... informatiques.

La signification que les informaticiens lui confèrent depuis un demi-siècle
est en contradiction avec l'éthymologie et l'usage académique que les
définitions ci-dessus démontrent.



On peut le regretter mais c'est comme ça !

L'ordre lexicographique est littéralement
l'ordre du dictionnaire, justement pas l'ordre déterminé par les
comparaisons numériques des caractères encodés en mémoire. Il faut cesser
d'utiliser des termes aussi confus.



Ca va être dur, c'est un terme consacré (pour les informaticiens).
Habituellement, ce sont les dictionnaires qui se plient aux usages de la
langue et qui introduisent de nouvelles definitions pour des mots
existants ou de nouveaux mots...

L'ordre que permet de définir strcmp dépend totalement de la représentation
interne des caractères choisie pour le système et l'application courante via
notamment l'encodage et le jeu de caractères.

Dans les faits, strcmp est majoritairement utilisée pour déterminer si 2
chaines ont le même contenu, avec l'un des deux idiomes ``!strcmp(a,b)'' ou
``strcmp(a,b) == 0''.



Alors ça, ce n'est pas vrai du tout.
Exemple (en C++. Désolé mais comme la discussion est dans le forum du
langage C...):
Surcharge des opérateurs de comparaison pour une classe Chaîne faite
"maison"
int operator==(const Chaine& s1, const Chaine& s2)
{
return strcmp(s1.la_chaine, s2.la_chaine) == 0;
}

int operator!=(const Chaine& s1, const Chaine& s2)
{
return strcmp(s1.la_chaine, s2.la_chaine) != 0;
}

int operator<(const Chaine& s1, const Chaine& s2)
{
return strcmp(s1.la_chaine, s2.la_chaine) < 0;
}

int operator>(const Chaine& s1, const Chaine& s2)
{
return strcmp(s1.la_chaine, s2.la_chaine) > 0;
}
int operator<=(const Chaine& s1, const Chaine& s2)
{
return strcmp(s1.la_chaine, s2.la_chaine) <= 0;
}

int operator>=(const Chaine& s1, const Chaine& s2)
{
return strcmp(s1.la_chaine, s2.la_chaine) >= 0;
}

avec
class Chaine
{
private :
int la_longueur;
char* la_chaine;
....
};

C'est une chance que cette fonction ne soit pas
localisée : cela permet de lui conserver son efficacité, avec une expansion
en ligne par la plupart des compilateurs modernes. En revanche strcoll
prétend adresser la question de l'ordre "du dictionnaire" mais une
implémentation ad hoc des spécificités culturelles locales est souvent
préférable.



Ca c'est sûr !
Avatar
Charlie Gordon
"Mickaël Wolff" a écrit dans le message de news:
489a0e5d$0$12027$
Wykaaa a écrit :

Sauf à faire volontairement le naïf ou être réellement ignorant, tout
informaticien sait ce qu'est l'ordre lexicographique et ne confie pas
sont interprétation à un dictionnaire littéraire :-((



Ben non, moi je ne sais pas. C'est certainement parce que je n'ai jamais
eu de cours de théorie du langage ? Si j'en crois les explications de
Charlie, j'utilises l'anglicisme collation (miam) ou interclassement en
lieu et place de « ordre lexicographique ».



QED.
Avatar
candide
Wykaaa a écrit :

Ca va être dur, c'est un terme consacré (pour les informaticiens).



C'est ce qui me semblait aussi mais apparemment ce n'est pas le cas.

Pourtant, l'ordre lexicographique intervient souvent dans des situations
algorithmiques, par exemple, si on cherche à énumérer les permutations
d'une suite d'objets, par exemple les 6 permutations de 3 objets a-b-c,
l'algorithme qui vient spontanément à l'esprit est d'utiliser l'ordre
lexicographique. Idem pour les anagrammes ou les combinaisons. L'ordre
naturel d'une famille d'entiers naturels lorsqu'on les écrit dans une
base donnée et avec le même nombre de chiffres est donné par un ordre
lexicographique.
Avatar
Antoine Leca
En news:4899f553$0$952$, Wykaaa va escriure:
Antoine Leca a écrit :
En news:48956e6b$0$945$, Wykaaa va escriure:
Par rapport à l'ordre lexicographique (codage des caractères).



Mmmm, ce n'est pas la même chose...

LEXICOGRAPHIQUE adj. XIXe siècle. [...]



Sauf à faire volontairement le naïf ou être réellement ignorant, tout
informaticien sait ce qu'est l'ordre lexicographique



Je n'avais pas l'intention d'être particulièrement naïf sur ce coup ; donc
j'en conclus que tu m'exclus de la catégorie des informaticiens.
Ce qui est probablement adéquat, puisque contrairement à vous le plus clair
de mon travail n'est pas de concevoir des programmes, mais plutôt de faire
marcher ceux qui existent (certains appellent cela de l'exploitation) ; et
effectivement je ne fréquente pas les spécialistes des langages (dont j'ai
découvert l'existence en travaillant sur la norme C99).


Pour moi, l'ordre de tri tel qu'utilisé en informatique est une chose, et
c'est effectivement normalement l'ordre du codage, la notion de jeu de
caractères etc. Tout cela désigne une seule et même chose pour moi, et
depuis des années je sais que cela implique que les majuscules vont d'un
côté, et les minuscules de l'autre.

Depuis un peu moins d'années (mais plusieurs quand même ;-) ), je sais aussi
que l'on peut faire des tris plus perfectionnés, avec des traitements
incorporés, par exemple pour faire que la distinction de la casse soit
abolie, voire (c'est plus récent) amenuïe --il s'agit alors de tris à
plusieurs passes.
Évidemment, la mise en ouvre de ces nouveaux ordres a un coût, ce qui fait
que pour moi, je réserve le nom de tri informatique à celui qui précède (le
plus rapide et le plus simple à programmer), et j'ai entendu divers noms
pour qualifier ces tris plus élaborés.

Depuis quelques années, j'ai appris que « l'ordre du dictionnaire », qui
n'était que l'un de ces qualificatifs sus-mentionnés, possédait d'une part
un nom, « lexicographique » (dont la liaison avec l'éthymologie me paraît
limpide), et aussi des définitions plus ou moins normalisées ; en ce qui
concerne le français on a ainsi des règles plus ou moins abscons sur l'ordre
des accents (cf. l'algorithme officiel de Unicode) ; en espagnol, il y a des
discussions sans fin sur le fait que CH et LL soient (vision européenne), ou
pas (vision américaine), des lettres séparées de l'alphabet. Etc.

J'en étais donc arrivé à considérer que d'un côté l'ordre lexicographique
désignait des règles de tri particulières et souvent complexes, associées à
des notions à géométrie variable comme celle de locale, et impliquait des
temps de traitement important ; l'archétype de ce phénomène est pour moi la
fonction strcoll().
Et que d'un ordre côté on avait toujours l'ordre lié au codage des
caractères, très souvent utilisé par les informaticiens même s'il n'est pas
toujours adéquat pour la présentation, et symbolisé par la fonction strcmp()
dont il est question dans cette discussion.

Il me semblait donc que ta remarque induisait une confusion qu'il eût été
bon de dissiper.


Cependant, à lire ta réaction et celle de plusieurs autres, il semblerait
que je me trompai, et que pour les informaticiens (qui à par moi doivent
constituer l'essentiel du public de ce forum) la notion de «
lexicographique » a un sens particulier, différent de celui généralement /
antérieurement accepté (et repris par le dictionnaire de l'Académie).


et ne confie pas sont interprétation à un dictionnaire littéraire



Le dictionnaire de l'Académis N'a PAS vocation à être un dictionnaire
littéraire ; si l'est, c'est que les Sages se sont fourvoyés. Pour moi, il a
l'avantage d'être doté d'un certain prestige, d'être indépendant des
querelles mercantiles liées aux éditeurs (L. contre R., etc.), et surtout
d'être lié à un signet sur mon navigateur. Je ne pense pas que les autres
dictionnaires « généraux » (c'est-à-dire ceux qui ne sont pas des
dictionnaires techniques d'informatique) aient des définitions sensiblement
différentes pour « lexicographique », mais il est vrai que je n'ai pas été
vérifié.


Antoine
1 2 3 4 5