OVH Cloud OVH Cloud

Traduire en C++ ?

44 réponses
Avatar
Pierre Maurette
Bonjour,
J'ai quelques petites fonctions C90, dont je souhaite réutiliser le
code source, éventuellement légèrement modifié (donc pas de mise en
bib).
Faisant largement appel à stdio.h elles sont tout sauf "idiomatiques"
en C++, mais elles sont parfaitement (hum, je l'espère en tous cas)
conformes à la norme de ce langage. Je précise que l'interface
elle-même est C plus que C++. Un exemple:

int AjouteNumLignes(const char nom_in[]
,const char nom_out[]
,const int nbr_caracts
);

Le int de retour est sémantiquement un bool.
Réécririez-vous ces fonctions en vue d'une utilisation en C++, sachant
qu'elles ont été validées par l'usage dans leur version actuelle ?
Quelle serait la raison objective de cette réécriture ?
Pour l'instant, je pense qu'il est possible de réutiliser "as is" ces
fonctions. Eventuellement en modifiant l'interface:

bool AjouteNumLignesCPP(const std::string nom_in
,const std::string nom_out
,const int nbr_caracts
)
{
return (AjouteNumLignesC(nom_in.c_str()
,nom_out.c_str()
,nbr_caracts) != 0);
}

Merci pour vos lumières.
--
Pierre

10 réponses

1 2 3 4 5
Avatar
Pierre Maurette
Fabien LE LEZ a écrit:

J'ai méa-culpé


Ne faudrait-il pas écrire "mea-culpé" ?
Méat coupé ?

--
Pierre


Avatar
Fabien LE LEZ
On Tue, 31 Aug 2004 17:32:41 +0200, Pierre Maurette
:

Je vais tenter avec
un .asm, mais je n'y crois pas trop.


Au pire, il me semble que Borland fournit un assembleur ; tu peux donc
transformer un .asm en .obj, et inclure ce dernier dans ton projet.


--
;-)

Avatar
Michel Michaud
Dans news:, Andre
Dans le cas de std::string, avec une bibliothèque standard
raisonnablement optimisée, il n'est pas nécessaire de passer par
référence.


Je ne crois pas qu'on puisse dire ça. Une bibliothèque standard
optimisée ou pas, devra l'être selon certains critères. Dans le
cas de std::string, l'optimisation qui permettrait de pouvoir
se passer de la copie (habituellement un comptage de référence
et un COW) est un mauvais choix dans plusieurs contextes et est
de plus en plus éliminée...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
kanze
Jean-Marc Bourguet wrote in message
news:...
Pierre Maurette writes:

Fabien LE LEZ a écrit:

On Tue, 31 Aug 2004 15:34:11 +0200, Pierre Maurette
:
[...]


Et si AjouteNumLignes() est une méthode,


Une fonction membre, tu veux dire ?
Oui.


Il me semblait que je pouvais écrire "méthode [d'instance par
défaut]", et "méthode de classe [static]".


Methode ne fait pas partie du vocabulaire C++. Certains l'employent
mais on ne sait jamais si ca designe toutes les fonctions membres ou
seulement les virtuelles.


Certains ? Je dirais plutôt beaucoup. Moi-même, je m'en sers (pour des
fonctions membre C++) dans deux contextes :

- Quand je fais une comparaison avec deux langages, par exemple le C++
et le Java. Alors, plutôt que d'utiliser deux vocables pour la même
chose, selon le langage, j'unifie sur « méthode ».

- Quand je fais la conception, en UML. Même quand je sais que
l'implémentation serait en C++, au niveau de la conception, en UML,
une classe a des méthodes, et non des fonctions.

Dans la pratique, ce n'est pas difficile à imaginer que cette dernière
raison finit par avoir raison des conventions actuelles. Pour la plupart
des programmeurs, le C++ n'est qu'un outil, sans assez d'importance pour
mériter son propre vocabulaire, et tout leur travail tourne autour de la
conception.

Moi-même, je trouve aussi qu'une fois la conception bien faite, le
codage est plutôt simple et mechanique. C'est donc que dans la pratique,
je suis plus amené à discuter sur la conception, et donc à utiliser le
mot méthode, que sur le codage, avec le mot fonction. Parce que je
maintiens mon intérêt pour les détails de C++ quand même, je maintiens
aussi l'usage des deux vocables, selon le contexte. Mais je crois que
j'en fais exception.

--
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
Fabien LE LEZ wrote in message
news:...

On Tue, 31 Aug 2004 14:19:08 +0200, Fabien LE LEZ
:

la solution canonique pour passer un objet en paramètre est la
référence constante.


D'ailleurs, il m'est arrivé d'écrire :

// .h
void f (std::string nom);

// .cpp
void f (std::string nom)
{
nom+= ".extension";
...
}

Plus tard, en voulant utiliser la fonction, j'ai dû chercher dans le
.cpp pour comprendre d'où venait le passage par valeur. Mon erreur
venait du fait que la copie du std::string pour modification est un
détail d'implémentation, et ne doit donc pas apparaître dans la
déclaration. Le code correct est :

// .h
void f (std::string const& nom);

// .cpp
void f (std::string const& nom_)
{
std::string nom (nom_);
nom+= ".extension";
...
}


Je fais en fait comme toi ici. Mais je reconnais la validité de
l'argument qui dit que pour l'utilisateur, std::string et std::string
const& sont des synonymes. Le choix d'un ou de l'autre dépendrait alors
uniquement des considérations de l'implémentation.

Ce que je n'aime pas dans cet argument, c'est que ce detail de
l'implémentation se trouve dans l'en-tête, et que si je le change, je
provoque la récompilation de tout le code utilisateur.

--
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
Andre Heinen wrote in message
news:...

Cependant je suis d'accord avec Fabien: pour la clarté du code,
il faut mieux utiliser l'idiome habituel.


L'idiome habituel peut varier d'un utilisateur à l'autre. John Potter,
dans un posting dans comp.lang.c++.moderated, disait une fois qu'il
considérait l'utilisation d'une référence ici une optimisation. Et la
règle en ce qui concerne les optimisations étaient simples : seulement
quand le profileur dit que c'est nécessaire.

(Ceci dit, j'ai parfois du mal à savoir quand John veut être sérieux, et
quand il s'amuse avec le lecteur.)

--
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
Andre Heinen
On Tue, 31 Aug 2004 17:01:53 +0200, Fabien LE LEZ
wrote:

Plus tard, en voulant utiliser la fonction, j'ai dû chercher dans le
.cpp pour comprendre d'où venait le passage par valeur.
Mon erreur venait du fait que la copie du std::string pour
modification est un détail d'implémentation, et ne doit donc pas
apparaître dans la déclaration. Le code correct est :

// .h
void f (std::string const& nom);

// .cpp
void f (std::string const& nom_)
{
std::string nom (nom_);
nom+= ".extension";
...
}


Tout bien réfléchi, je n'en suis plus aussi convaincu qu'hier.

Si je lis "void f(const string&)", j'en conclus que f ne va pas
modifier le string, et que je n'ai pas besoin d'en faire une
sauvegarde.

Si je lis "void f(string)", j'en conclus aussi que je n'ai pas
besoin de sauvegarder la valeur d'origine. En plus, j'en conclus
que f a besoin d'une copie pour son usage personnel: ce n'est pas
mon problème. Il est clair que c'est un détail d'implémentation,
et il ne me viendra pas à l'idée d'aller vérifier dans le fichier
cpp. Surtout si la fonction est correctement documentée ;-)

Lorsque f a besoin de sa propre copie, passer un string par
valeur ne me paraît pas être une si mauvaise pratique.

--
Andre Heinen
My address is "a dot heinen at europeanlink dot com"

Avatar
Andre Heinen
On Tue, 31 Aug 2004 20:16:42 -0400, "Michel Michaud"
wrote:

Dans le
cas de std::string, l'optimisation qui permettrait de pouvoir
se passer de la copie (habituellement un comptage de référence
et un COW) est un mauvais choix dans plusieurs contextes et est
de plus en plus éliminée...


J'avoue que je ne vois pas dans quel cas un COW puisse poser
problème. Peux-tu nous donner un exemple?

--
Andre Heinen
My address is "a dot heinen at europeanlink dot com"

Avatar
Andre Heinen
On Tue, 31 Aug 2004 17:32:41 +0200, Pierre Maurette
wrote:

Il me reste à voir que faire avec mes sorties vers
stderr.


Tu m'y fais penser: pour garantir que le mélange des E/S C et C++
fonctionne correctement, ne doit-on pas appeler
sync_with_stdio()? Je ne sais pas comment ça marche.

--
Andre Heinen
My address is "a dot heinen at europeanlink dot com"

Avatar
Falk Tannhäuser
Andre Heinen wrote:
Si je lis "void f(const string&)", j'en conclus que f ne va pas
modifier le string, et que je n'ai pas besoin d'en faire une
sauvegarde.

Si je lis "void f(string)", j'en conclus aussi que je n'ai pas
besoin de sauvegarder la valeur d'origine. En plus, j'en conclus
que f a besoin d'une copie pour son usage personnel: ce n'est pas
mon problème. Il est clair que c'est un détail d'implémentation,
et il ne me viendra pas à l'idée d'aller vérifier dans le fichier
cpp. Surtout si la fonction est correctement documentée ;-)


Et on peut être sûr que le paramètre n'est pas 'aliasé"
comme ici :
________________________________________________________
#include <string>
#include <cstddef>
#include <iostream>
#include <ostream>

void f(std::string const& nom, std::string& nom_complet)
{
nom_complet = "/dir/subdir/";
nom_complet += nom + ".ext";
}

int main(int argc, char** argv)
{
if(argc<2) return EXIT_FAILURE;
std::string nom_fichier(argv[1]);
f(nom_fichier, nom_fichier); // Ouuuuuuuuuuups!
std::cout << nom_fichier << 'n';
return EXIT_SUCCESS;
}
________________________________________________________

Bien sûr, dans des vrais programmes, on n'écrit jamais
des bêtises comme ça ...

Falk

1 2 3 4 5