OVH Cloud OVH Cloud

C vers C++

8 réponses
Avatar
boolegue
Bonjour a tous,

voila je debute en C depuis 2 mois et je dois modifier un code (30000
lignes, ce qui est gros pour moi !) ecrit dans ce language.
J ai deja fait quelques modifs, mais la facon dont est ecrit ce code me
rend dingue : pas un gramme de modularite !
Alors je suis a la recherche de conseils pour introduire un peu d'OOP
dedans, et petit a petit transformer le code entierement en C++.
Comment dois-je m'y prendre ?

Antoine.

8 réponses

Avatar
Michael K.
Bonjour a tous,

voila je debute en C depuis 2 mois et je dois modifier un code (30000
lignes, ce qui est gros pour moi !) ecrit dans ce language.
J ai deja fait quelques modifs, mais la facon dont est ecrit ce code me
rend dingue : pas un gramme de modularite !
Alors je suis a la recherche de conseils pour introduire un peu d'OOP
dedans, et petit a petit transformer le code entierement en C++.
Comment dois-je m'y prendre ?

Antoine.



Je pense qu'a moins de repenser entierement le code pour le rendre
plus oriente objet, le code final sera plutot proche de ce qu'on
appelle du "C+" parfois (du C avec des cout/cin et deux trois bricoles
pas vraiment representatives du langage.)

Sinon il y a un bouquin qui ne m'a pas l'air foncierement mauvais,
"Refactoring Improving the Design of Existing Code" qui peut
eventuellement donner des pistes pour savoir par ou commencer generalement.


--
Michael K. (epitech)
http://etudiant.epitech.net/~meik/
"SoftIce est avant tout un desassembleur."
E.D au proces en appel de Guillermito

Avatar
ByB
a formulé ce vendredi :
Bonjour a tous,

voila je debute en C depuis 2 mois et je dois modifier un code (30000
lignes, ce qui est gros pour moi !) ecrit dans ce language.
J ai deja fait quelques modifs, mais la facon dont est ecrit ce code me
rend dingue : pas un gramme de modularite !
Alors je suis a la recherche de conseils pour introduire un peu d'OOP
dedans, et petit a petit transformer le code entierement en C++.
Comment dois-je m'y prendre ?

Antoine.


A mon avis, tu devrais déjà identifier les objets, créer les classes
correspondantes, et puis implémenter les méthodes ...

--
C'est facile. C'est complètement automatique. Il suffit de cliquer. Il
existe un outil qui fait ça.

Avatar
Marc Boyer
Le 06-10-2006, a écrit :
voila je debute en C depuis 2 mois et je dois modifier un code (30000
lignes, ce qui est gros pour moi !) ecrit dans ce language.


Tu débutes en C ? Mais quelle est ta connaissance de C++ ?

J ai deja fait quelques modifs, mais la facon dont est ecrit ce code me
rend dingue : pas un gramme de modularite !
Alors je suis a la recherche de conseils pour introduire un peu d'OOP
dedans, et petit a petit transformer le code entierement en C++.
Comment dois-je m'y prendre ?


Est-ce que cela en vaut le coup ?
Cela dépend beaucoup des modifs que tu as à faire du le code.

Remplacer des printf par des cout comme le disait un autre
contributeur est dangeueux, car comme ils ne partagent
pas les même buffer, l'ordre des écritures n'est pas garantit.

Tu peux toujours, pour chaque structure X, identifier les
fonctions qui n'ont qu'un paramètre de type X* ou X et en
faire des fonctions membres. Mais cela demande de modifier
tous les appels...
L'introduction du const implique aussi de tels changements
un peu partout.

La première chose à faire serait AMHA d'imaginer que chaque
struct est une classe et de tenter de faire le diagramme
de classe, de formaliser les relations.

Mais bon, je dis ça pour lancer le débat car pas grand monde
n'a répondu, mais ma seule tentative de reprise de code
a été à ce jour un échec.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)

Avatar
boolegue
Marc Boyer wrote:
voila je debute en C depuis 2 mois et je dois modifier un code (30000
lignes, ce qui est gros pour moi !) ecrit dans ce language.


Tu débutes en C ? Mais quelle est ta connaissance de C++ ?


Mes connaissances en C++ se limitent a celles que je viens d'acquerir
en C ! Celles en OOP se limitent a celles du disponibles en fortran,
plus ce que j ai pu lire sur le sujet.
J ai pas mal d experience en fortran, et j y mets autant de OOP que
possible.
Difficile de s en passer maintenant !


J ai deja fait quelques modifs, mais la facon dont est ecrit ce code me
rend dingue : pas un gramme de modularite !
Alors je suis a la recherche de conseils pour introduire un peu d'OOP
dedans, et petit a petit transformer le code entierement en C++.
Comment dois-je m'y prendre ?


Est-ce que cela en vaut le coup ?
Cela dépend beaucoup des modifs que tu as à faire du le code.


Peut etre que ca ne vaut pas le coup, je ne connais pas encore assez
bien ni le code, ni le C++ pour en etre certain.
Mais d une part je suis curieux d apprendre le C++ et des concepts OOP
plus pousses que ceux du fortran actuel :-).
D autre part les premieres modifs que je dois faire me semblent
correspondre a ce que peut faire le C++.
Ce code traite, entre autre, de particules, ils a etait ecrit avec des
particules spheriques, et je dois faire en sorte qu il puisse traiter a
priori n importe quel type de particules.
Cela me fait penser a un exemple que j ai lu sur le C++, ou une classe
"forme" est capable de gerer differents objets de type "cercle",
"carre", etc ...


Remplacer des printf par des cout comme le disait un autre
contributeur est dangeueux, car comme ils ne partagent
pas les même buffer, l'ordre des écritures n'est pas garantit.

Tu peux toujours, pour chaque structure X, identifier les
fonctions qui n'ont qu'un paramètre de type X* ou X et en
faire des fonctions membres. Mais cela demande de modifier
tous les appels...
L'introduction du const implique aussi de tels changements
un peu partout.


C est ce que j ai essayer de faire jusque la.
Le code est constitue d une douzaine de fichiers, pouvant faire 5000
lignes !
Au debut j ai commence a simplement ajouter les modifs tellequelles, ca
m a vite pris la tete de suivre chaque appel d un fichier a l autre et
meme de me perdre dans un seul fichier !
J ai alors decoupe les choses que je changes par objet, rajoute du
static aux fonctions locales, du const aux variables passees a ne pas
modifier.

La première chose à faire serait AMHA d'imaginer que chaque
struct est une classe et de tenter de faire le diagramme
de classe, de formaliser les relations.

Mais bon, je dis ça pour lancer le débat car pas grand monde
n'a répondu, mais ma seule tentative de reprise de code
a été à ce jour un échec.

Marc Boyer


En fait, la question que je me pose est de savoir s il est possible de
mixer du C et C++ ? Par exemple, est il possible d utiliser l appel par
reference a la sauce C++ depuis du C ? Et plein d autres questions ...
Est ce que je dois renomer tout les fichiers en .cpp ?
Tout est encore tres flou pour ce qui est de comment commencer a mettre
du C++ la dedans.

Merci beaucoup pour ton aide. :-)

Antoine.


Avatar
Marc Boyer
Le 10-10-2006, a écrit :
Marc Boyer wrote:
voila je debute en C depuis 2 mois et je dois modifier un code (30000
lignes, ce qui est gros pour moi !) ecrit dans ce language.


Tu débutes en C ? Mais quelle est ta connaissance de C++ ?


Mes connaissances en C++ se limitent a celles que je viens d'acquerir
en C ! Celles en OOP se limitent a celles du disponibles en fortran,
plus ce que j ai pu lire sur le sujet.
J ai pas mal d experience en fortran, et j y mets autant de OOP que
possible.
Difficile de s en passer maintenant !


Oui, la structuration du code 'orienté objet' est un bon
paradigme.

J ai deja fait quelques modifs, mais la facon dont est ecrit ce code me
rend dingue : pas un gramme de modularite !
Alors je suis a la recherche de conseils pour introduire un peu d'OOP
dedans, et petit a petit transformer le code entierement en C++.
Comment dois-je m'y prendre ?


Est-ce que cela en vaut le coup ?
Cela dépend beaucoup des modifs que tu as à faire du le code.


Peut etre que ca ne vaut pas le coup, je ne connais pas encore assez
bien ni le code, ni le C++ pour en etre certain.
Mais d une part je suis curieux d apprendre le C++ et des concepts OOP
plus pousses que ceux du fortran actuel :-).


C'est une motivation.

D autre part les premieres modifs que je dois faire me semblent
correspondre a ce que peut faire le C++.
Ce code traite, entre autre, de particules, ils a etait ecrit avec des
particules spheriques, et je dois faire en sorte qu il puisse traiter a
priori n importe quel type de particules.
Cela me fait penser a un exemple que j ai lu sur le C++, ou une classe
"forme" est capable de gerer differents objets de type "cercle",
"carre", etc ...


En effet.

Remplacer des printf par des cout comme le disait un autre
contributeur est dangeueux, car comme ils ne partagent
pas les même buffer, l'ordre des écritures n'est pas garantit.

Tu peux toujours, pour chaque structure X, identifier les
fonctions qui n'ont qu'un paramètre de type X* ou X et en
faire des fonctions membres. Mais cela demande de modifier
tous les appels...
L'introduction du const implique aussi de tels changements
un peu partout.


C est ce que j ai essayer de faire jusque la.
Le code est constitue d une douzaine de fichiers, pouvant faire 5000
lignes !
Au debut j ai commence a simplement ajouter les modifs tellequelles, ca
m a vite pris la tete de suivre chaque appel d un fichier a l autre et
meme de me perdre dans un seul fichier !
J ai alors decoupe les choses que je changes par objet, rajoute du
static aux fonctions locales, du const aux variables passees a ne pas
modifier.


Une sorte de premier rafraichissement, qui permet de plus de
comprendre un peu mieux ce qui se passe.

La première chose à faire serait AMHA d'imaginer que chaque
struct est une classe et de tenter de faire le diagramme
de classe, de formaliser les relations.

Mais bon, je dis ça pour lancer le débat car pas grand monde
n'a répondu, mais ma seule tentative de reprise de code
a été à ce jour un échec.


En fait, la question que je me pose est de savoir s il est possible de
mixer du C et C++ ? Par exemple, est il possible d utiliser l appel par
reference a la sauce C++ depuis du C ? Et plein d autres questions ...


Oui et non.
Strictement parlant, C et C++ sont deux langages différents.
Un code C se compile avec un compilateur C, un code C++ se
compile avec un compilateur C++, et il existe en C++ le 'extern "C"',
qui permet d'appeler depuis du C du code C++ et inversement.

En pratique, 99% du code C raisonnable écrit compile aussi
bien en C++ et donne le même résultat. Mais si tu tombes sur
le 1%, tu as du mal.
De nombreux programmeurs C font aussi compiler leur code
C par le compilo C *et* par le compilo C++ parce qu'ils le
considèrent comme plus tatillon, pour détecter le plus de code
suspect. Mais le code exécutable est généré par le compilo C.
Ma référence sur le sujet, c'est le 'Harbison & Steele', qui
est un bouquin de C qui liste en fin de chaque chapitre
les parties de C qui ne sont pas du C++.

Est ce que je dois renomer tout les fichiers en .cpp ?


Ca forcera ton compilo (VC ?) à considérer le code C comme
du code C++.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)



Avatar
boolegue
En fait, la question que je me pose est de savoir s il est possible de
mixer du C et C++ ? Par exemple, est il possible d utiliser l appel par
reference a la sauce C++ depuis du C ? Et plein d autres questions ...


Oui et non.
Strictement parlant, C et C++ sont deux langages différents.
Un code C se compile avec un compilateur C, un code C++ se
compile avec un compilateur C++, et il existe en C++ le 'extern "C"',
qui permet d'appeler depuis du C du code C++ et inversement.

En pratique, 99% du code C raisonnable écrit compile aussi
bien en C++ et donne le même résultat. Mais si tu tombes sur
le 1%, tu as du mal.
De nombreux programmeurs C font aussi compiler leur code
C par le compilo C *et* par le compilo C++ parce qu'ils le
considèrent comme plus tatillon, pour détecter le plus de code
suspect. Mais le code exécutable est généré par le compilo C.
Ma référence sur le sujet, c'est le 'Harbison & Steele', qui
est un bouquin de C qui liste en fin de chaque chapitre
les parties de C qui ne sont pas du C++.


Je vais chercher ce bouquin, y a t il une page web qui liste toutes les
differences, voire meme un "guide" du passage C vers C++ ?

Est ce que je dois renomer tout les fichiers en .cpp ?


Ca forcera ton compilo (VC ?) à considérer le code C comme
du code C++.


J utilise ICC et GCC sous linux.
Est ce que tout faire compiler par un compilo C++ et virer le 1%
d'ivraie, serait un bon point de depart ?

Antoine.


Avatar
Marc Boyer
Le 11-10-2006, a écrit :
En pratique, 99% du code C raisonnable écrit compile aussi
bien en C++ et donne le même résultat. Mais si tu tombes sur
le 1%, tu as du mal.
De nombreux programmeurs C font aussi compiler leur code
C par le compilo C *et* par le compilo C++ parce qu'ils le
considèrent comme plus tatillon, pour détecter le plus de code
suspect. Mais le code exécutable est généré par le compilo C.
Ma référence sur le sujet, c'est le 'Harbison & Steele', qui
est un bouquin de C qui liste en fin de chaque chapitre
les parties de C qui ne sont pas du C++.


Je vais chercher ce bouquin, y a t il une page web qui liste toutes les
differences, voire meme un "guide" du passage C vers C++ ?


Je n'en connais pas. Vu la popularite du sujet, je pense
qu'il doit y en avoir pleins. Mais combien de bonnes ?

Est ce que je dois renomer tout les fichiers en .cpp ?


Ca forcera ton compilo (VC ?) à considérer le code C comme
du code C++.


J utilise ICC et GCC sous linux.
Est ce que tout faire compiler par un compilo C++ et virer le 1%
d'ivraie, serait un bon point de depart ?


Je ne sais pas.
Deja, le 1% d'ivraie est difficile a cerner: il existe du code
accepte par un compilo C et C++ mais qui ne donnera pas le
meme resultat...
Essaye toujours.

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)



Avatar
David F.

Je n'en connais pas. Vu la popularite du sujet, je pense
qu'il doit y en avoir pleins. Mais combien de bonnes ?


Peut être celle ci est intéressante :

http://david.tribble.com/text/cdiffs.htm