OVH Cloud OVH Cloud

recherche d'un element suivant la valeur d'un des champs

184 réponses
Avatar
Alain Cabiran
Bonjour,

j'ai cherché, testé, retesté, essayé, réessayé et n'ai pas trouvé
de solution à ce problème

assume using namespace std :-)

imaginons avoir :

class objet
{
public:
objet(int valeur) : monchamps(valeur) { } ;
int getChamps() const { return monchamp; } ;
private:
int monchamps();
};

un conteneur : list<objet> liste;
son iterateur : list<objet>::iterator it;

une valeur prédéfinie : int valeur = 5;

est-ce qu'il est possible, en utilisant les adaptateurs stl,
d'avoir l'équivalent de :

cherche dans liste le premier élément avec la condition
it->monchamp == valeur ?

j'ai commencé par :

it = find_if(liste.begin(), liste.end(), TOTO);

ensuite j'ai cherché TOTO : bind2nd(equal_to<int>(), valeur)

et là ... je sais pas, j'ai essayé de placer :

mem_fun_ref(&objet::getChamps) mais je n'ai pas trouvé où le mettre
et même si je peux seulement l'y mettre.

quelqu'un a une idée ?

Alain Cabiran

ps: il manque évidemment le constructeur de copie, les operateurs de
comparaisons, ... dans la classe, c'est juste pour faire plus court.

10 réponses

Avatar
kanze
"Michel Michaud" wrote in message
news:<NLb9d.31747$...
Dans le message ,
"Michel Michaud" wrote in message
news:<8cK8d.11528$...
Dans le message ,
Sauf qu'il faut tout de même un tant soit peu de standardisation.
Si un code qui fonctionne sur un poste ne fonctionne plus sur le
poste d'à côté, avec le même compilo mais Windows en espagnol ou
en grec, ça n'est pas acceptable. De même, si je ne peux plus
compiler du code sous prétexte que l'auteur l'a tapé sous Linux,
ça n'est pas plus acceptable.


Mais je ne vois pas pourquoi ce serait le cas.


C'est le cas. Que tu le vois ou non. J'ai déjà eu des problèmes à
porter du code depuis Solaris à HP/UX. Heureusement, que dans les
commentaires, parce qu'il n'y avait pas d'accents ailleurs. Mais le
fait est que c'est problèmatique. Ça marche aussi longtemps que tu
utilises qu'un seul système, vendu et/ou configuré pour un seul
locale. Dès que tu sors de cette configuration, tu as des problèmes.


Je ne suis pas certain qu'on se comprend bien. Mon impression est que
les u ont été inventés pour ça : si tu utilises des caractères qui
sont acceptables (codes u acceptés selon l'annexe de la norme), tu
devrais pouvoir les coder en u et les utiliser sur un autre
compilateur.


Tout à fait. Mais je croyais que tu parlais du code qui contenait
réelement des caractères accentués, non des u00E9 et compagnie.

En fait, les outils de développement pourraient faire ça pour toi.


Je crois que c'était un peu l'intention. Toi, tu écris été, mais ce qui
se trouvait dans le fichier était u00E9tu00E9. Et évidemment, quand le
fichier contenait u00E9tu00E9, l'éditeur affichait été.

Mais apparamment, mes éditeurs ne sont pas à jour. Parce qu'il ne
reconnaissent pas les uxxxx.

Accents ou pas, si tu as un source codé en caractères 8 bits et que tu
lis ce fichier ailleurs en considérant que ce sont des caractères 16
bits, il y aura un problème.


De même que si tu as un source codé en EBCDIC, et tu essaies à le
compiler sur un système basé sur ASCII. Voire même souvent, si tu as un
fichier de Windows, avec les CRLF, et tu essaies de le compiler sous
Unix. (Curieusement, je n'ai jamais eu de problèmes en sens contraire.
On dirait que Windows, c'est une plate-forme plus ouverte que certains
Unix.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34




Avatar
kanze
"Michel Michaud" wrote in message
news:<4e39d.20123$...
Dans le message ,
En passant, il y a une chose que je n'arrive pas à comprendre.
Depuis plus de vingt ans que je lis des livres techniques, le
meilleur écrit, c-à-d celui dont l'anglais était le mieux, c'est
bien le Josuttis et Vandevoort. Or, ni l'un ni l'autre des auteurs
n'est anglophone d'origine. Je n'arrive pas à comprendre comment ils
l'ont fait.


L'étape nécessaire s'appelle révision linguistique. Ça coûte cher,
alors seulement les livres qui ont un bon potentiel de vente peuvent
se le permettre. Rien de mystérieux :-)


Il y a plus que ça. Tu pourrais passer quelque chose que j'aurais écrit
par autant de révisions linguistiques que tu veux, il ne serait jamais
aussi bon que ce qu'ils ont écrit. La révision linguistique peut
ratrapper des erreurs gramatiques et des choses semblables, mais il ne
peut pas ajouter des détails qui manquent, ni en enlever quand il y en a
de trop. Il ne peut pas changer l'ordre ni l'organisation de la
présentation. Il ne peut pas ajouter des exemples où il en manque.

La révision linguistique peut rendre acceptable quelque chose qui était
mauvaise. Elle ne peut pas rendre excellent quelque chose qui n'était
que bon au départ.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Arnaud Meurgues
Loïc Joly wrote:

La solution en python est d'indiquer au tout début du fichier l'encoding
de ce fichier. Ca me semble être une solution applicable en C++, non ?


Tout-à-fait. C'est ce que je suggérais plus haut.
Mais mon point de vue est que la norme actuelle ne peut demander de
comprendre n'importe quel couple charset/encoding puisqu'elle ne définit
pas de manière de le spécifier.

Mais sinon, moi, je suis pour un moyen de spécifier charset et encoding
dans un fichier source C++.

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Arnaud Meurgues
wrote:

Applicable, mais non appliqué. Je verrais bien un espèce de
#pragma codeset iso_8859_1
par exemple.


Je suis pour.

Une autre possibilité que j'ai considéré, c'est un fichier de
configuration dans le répertoire, du genre .codeset. Si ce fichier est
présent, le compilateur lirait tous les fichiers du répertoire avec cet
encodage.


Là, je suis contre car cette solution ne permet pas, telle que tu
l'énonces, d'avoir plusieurs encodages dans le même répertoire.
Si on affine en permettant que le fichier .codeset puisse:
- spécifier un codeset par défaut pour tous les fichiers
- spécifier un codeset par fichier remplaçant le défaut
alors ça devient une solution que je trouve acceptable.

(L'avantage, c'est qu'on peut le faire après le coup, sans
modifier les fichiers sources, et que les compilateurs qui ne
connaissent pas l'astuce ne verrait rien.)


Avec un pragma, ça n'embête pas non plus un compilo qui ne le gère pas.

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Gabriel Dos Reis
Arnaud Meurgues writes:

| wrote:
|
| > Applicable, mais non appliqué. Je verrais bien un espèce de
| > #pragma codeset iso_8859_1
| > par exemple.
|
| Je suis pour.

Je suis contre tout ce qui commence avec #pragma ou variantes.

[...]

| Avec un pragma, ça n'embête pas non plus un compilo qui ne le gère pas.

Si. Il ignore le pragma et se plaint après.

-- Gaby
Avatar
Falk Tannhäuser
wrote:
Fabien LE LEZ wrote in message
Du coup, tu n'as pas besoin que le compilo comprenne les caractères
non-ASCII, il suffit de modifier ton code en entrée. Par exemple :

a-zA-Z restent tels quels
_ devient _005F
é devient _00E9
à devient _00E0
rho minuscule devient _03C1

Et zou, tu tapes les caractères que tu veux, tu passes la moulinette,
et le compilo n'y voit que du feu. Reste à passer les messages
d'erreurs à la moulinette inverse, et le tour est joué.


Qu'est-ce qui se passe avec :

void
f()
{
int été ;
int _00E9t_00E9 ;
}

Ça deviendra

void f()
{
int _00E9t_00E9;
int _005F00E9t_005F00E9;
}
si j'ai bien compris.

Je ne suis pas sûr que cela ne pose pas de problèmes d'interopérabi lité
ailleurs, surtout au niveau de compatibilité avec le C ...
(Combien de compilateurs C++ bronchent aujourd'hui sur
char *pc = std::strchr("Hello", 'o');
ou mettent toupper / tolower dans le namespace std ?)

Falk


Avatar
Mickael Pointier
Accents ou pas, si tu as un source codé en caractères 8 bits et que tu
lis ce fichier ailleurs en considérant que ce sont des caractères 16
bits, il y aura un problème.


De même que si tu as un source codé en EBCDIC, et tu essaies à le
compiler sur un système basé sur ASCII. Voire même souvent, si tu as un
fichier de Windows, avec les CRLF, et tu essaies de le compiler sous
Unix. (Curieusement, je n'ai jamais eu de problèmes en sens contraire.
On dirait que Windows, c'est une plate-forme plus ouverte que certains
Unix.)


J'ai constaté la même chose chez moi.

Je bosse avec des linuxiens, qui ont un mal fou à digérer les retours
chariot façon windows, alors que de mon coté mes éditeurs et compilateurs
avalent les deux formats sans aucun problème.

Il ne reste plus guère que "notepad" pour ne pas supporter les retour
chariot façon unix.

Mike


Avatar
Mickael Pointier
[...]
En fait, il y a pas moins de trois encodages indépendamment courants à
la fois :

[...]
- Il y a celui qui sert dans la logique à l'intérieur des programmes,
pour déterminer si un caractère donné est un blanc ou un chiffre,
par exemple. Ici, ça dépend du programme -- beaucoup de programmes
utilise la même stratégie que le système, en limitant les caractères
qui l'intéresse à un petit ensemble dont l'encodage ne varient pas.
Mais si le programme va plus loin, cet encodage dépend du locale.

Et sur les systèmes dont je me sers, le locale par défaut dépend des
variables d'environement, qui sont propre à chaque utilisateur.
Donc, si le compilateur veut savoir l'encodage, il faut qu'il sache
qui a écrit le fichier. Et encore -- s'il détermine que c'est
l'utilisateur jakan (c'est mon identificateur ici) qui l'a écrit, il
doit encore régarder quel shell j'utilise (dans /etc/passwd), et en
fonction du shell, lire le fichier d'initialisation qui convient.
Sauf qu'il y a deux problèmes de taille avec cette politique :

[...]


D'ailleur, à titre d'anecdote, il y à eu récement un problème avec une des
beta-versions de "whidbey" (le petit nom de Visual Studio 2005), à propos de
la gestion des locales dans le compilateur.

Un certain nombre de personnes se sont trouvés à ne plus pouvoir de compiler
les sources C++ contenant des valeurs littérales en virgule flotante:

float pi=3.14159f;

Erreur :)


La raison est que le compilateur sur ces machines (françaises, et allemandes
en autre), se basait sur la locale qui était configurée pour utiliser la
virgule en temps que délimitateur décimal.

Super...

Donc obligé de changer la locale du système, parce que bien évidement le
compilateur n'acceptait pas non plus correctement que l'on tappe "3,14159f"
à la place :-)

Mike

Avatar
Jean-Marc Bourguet
writes:

(Note que plus un projet est grand, plus il y a des chances qu'il
soit international, et donc, plus il y a de chances que la langue du
projet soit l'anglais, où le problème des caractères accentués ne se
pose pas.)


This seems a somewhat naïve opinion :-)

Yours,

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
drkm
"Michel Michaud" writes:

Dans le message ,

"Michel Michaud" writes:

Oui, mais les outils permettant de transférer les fichiers n'ont
pas de problèmes avec mes accents...


Et avec ceux des autres ?

(je suis sérieux)


?


Que ces programmes n'aient pas de problème avec tes accents, ce
n'est pas très intéressant. Il me semble que c'est plutôt le nombre
incroyablement élevé d'encodages différents qui constitue un problème.

Mais je ne suis pas spécialiste en ces questions.

--drkm