barsichou
Messages postés1Date d'inscriptionmercredi 17 août 2011StatutMembreDernière intervention 2 septembre 2011 2 sept. 2011 à 16:28
Salut,
Merci pour toutes ces critiques. Rassure toi, c'est ce que j'attendais. Je fais un peu de C pour le boulot depuis 4 ans.
Là j'expérimente le C++ chez moi avec des mauvais réflexes en plus des lacunes.
Je prendrais en compte tes remarques la semaine prochaine.
Bon week end.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 2 sept. 2011 à 11:52
Très bonne source. Enfin quelque chose d'originale !
J'ai quelque remarques à faire sur le code. Je vais lancer pas mal de critiques, mais il ne faut pas en déduire que ton application est mauvaise, bien au contraire, elle est très bien.
- C'est une application C++ quasiment codé comme une application C. C'est dommage.
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace - Pour faire des listes ou des tableaux, évite de faire du "double*" un std::vector<double>, std::list<double> voir un std::array<double, int> aurait été préférable.
- cast non nécessaire. Si tu as un float, et que tu veux le faire rentrer dans un int, pas besoin de cast. C'est déjà valable.
- C cast à éviter. En C++ tu as: reinterpret_cast, static_cast et dynamic_cast qui sont à préférer. Ils ont tous les trois des comportements précis qui te permettent de bien choisir le cast à effectuer (différents type de sécurité).
- Une fonction qui ne prend pas d'argument, s'écrit "void function()" et non "void function(void)". Mettre void en argument est un ancien reliquat du C (ne pas mettre d'argument en C veut dire: infinité d'arguments, d'où le void pour empêcher cela), qui n'est plus nécessaire en C++.
- Plutôt que des "#define", préfère un static const qui revient strictement au même, sauf que tu as une protection de type que tu n'as pas avec une macro.
#define K_ENERGIE_RATIO 1.3 => static const float K_ENERGIE_RATIO = 1.3;
- En C++, on évite NULL, au profit de 0, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp - Quand tu travailles avec des booléens, utilise les comme tels. Ex: if (ctrl_pressed==true) => if (ctrl_pressed) et if (ctrl_pressed==false) => if (!ctrl_pressed)- BeatDetector* beatdec new BeatDetector(snd_mng);> Qui le delete à la fin ? Fuite de mémoire ?
D'ailleurs pourquoi faire un new ? Tu pourrais très bien écrire: BeatDetector beatdec(snd_mng); et passer l'adresse de beatdec.
Quand tu as le choix, préfère toujours utiliser un objet directement plutôt que de faire un new.
- Même remarque pour SoundManager. Je ne vois pas delete. Tu devrais avoir:
SoundManager snd_mng;
snd_mng.load_song(argv[1]); // load song in arguments
snd_mng.play();
snd_mng.pause();
// Create BeatDetector
BeatDetector beatdec(&snd_mng);
beatdec.audio_process(); // launch beats detection
- Plutôt que de passer par pointeur, passe par référence dès que tu le peux !
Tu devrais avoir: BeatDetector::BeatDetector(SoundManager& snd_mgr), voir "const SoundManager& snd_mgr", si le SoundManager n'a pas vocation à être modifié.
- new SoundManager() => Attention ! On fait "new SoundManager;" et non "new SoundManager();"
"new SoundManager;" veut dire: Allouer.
"new SoundManager();" veut dire: Créer une fonction SoundManager() qui retourne un objet de type SoundManager puis l'allouer.
En revanche, faire un "new Objet(argument)", veut bien dire: Allouer. Il y a une exception uniquement avec "()". C'est une subtilité du C++ pas terrible :(.
2 sept. 2011 à 16:28
Merci pour toutes ces critiques. Rassure toi, c'est ce que j'attendais. Je fais un peu de C pour le boulot depuis 4 ans.
Là j'expérimente le C++ chez moi avec des mauvais réflexes en plus des lacunes.
Je prendrais en compte tes remarques la semaine prochaine.
Bon week end.
2 sept. 2011 à 11:52
J'ai quelque remarques à faire sur le code. Je vais lancer pas mal de critiques, mais il ne faut pas en déduire que ton application est mauvaise, bien au contraire, elle est très bien.
- C'est une application C++ quasiment codé comme une application C. C'est dommage.
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Pour faire des listes ou des tableaux, évite de faire du "double*" un std::vector<double>, std::list<double> voir un std::array<double, int> aurait été préférable.
- cast non nécessaire. Si tu as un float, et que tu veux le faire rentrer dans un int, pas besoin de cast. C'est déjà valable.
- C cast à éviter. En C++ tu as: reinterpret_cast, static_cast et dynamic_cast qui sont à préférer. Ils ont tous les trois des comportements précis qui te permettent de bien choisir le cast à effectuer (différents type de sécurité).
- Une fonction qui ne prend pas d'argument, s'écrit "void function()" et non "void function(void)". Mettre void en argument est un ancien reliquat du C (ne pas mettre d'argument en C veut dire: infinité d'arguments, d'où le void pour empêcher cela), qui n'est plus nécessaire en C++.
- Plutôt que des "#define", préfère un static const qui revient strictement au même, sauf que tu as une protection de type que tu n'as pas avec une macro.
#define K_ENERGIE_RATIO 1.3 => static const float K_ENERGIE_RATIO = 1.3;
- En C++, on évite NULL, au profit de 0, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/null-en-cpp
- Quand tu travailles avec des booléens, utilise les comme tels. Ex: if (ctrl_pressed==true) => if (ctrl_pressed) et if (ctrl_pressed==false) => if (!ctrl_pressed)- BeatDetector* beatdec new BeatDetector(snd_mng);> Qui le delete à la fin ? Fuite de mémoire ?
D'ailleurs pourquoi faire un new ? Tu pourrais très bien écrire: BeatDetector beatdec(snd_mng); et passer l'adresse de beatdec.
Quand tu as le choix, préfère toujours utiliser un objet directement plutôt que de faire un new.
- Même remarque pour SoundManager. Je ne vois pas delete. Tu devrais avoir:
SoundManager snd_mng;
snd_mng.load_song(argv[1]); // load song in arguments
snd_mng.play();
snd_mng.pause();
// Create BeatDetector
BeatDetector beatdec(&snd_mng);
beatdec.audio_process(); // launch beats detection
- Plutôt que de passer par pointeur, passe par référence dès que tu le peux !
Tu devrais avoir: BeatDetector::BeatDetector(SoundManager& snd_mgr), voir "const SoundManager& snd_mgr", si le SoundManager n'a pas vocation à être modifié.
- new SoundManager() => Attention ! On fait "new SoundManager;" et non "new SoundManager();"
"new SoundManager;" veut dire: Allouer.
"new SoundManager();" veut dire: Créer une fonction SoundManager() qui retourne un objet de type SoundManager puis l'allouer.
En revanche, faire un "new Objet(argument)", veut bien dire: Allouer. Il y a une exception uniquement avec "()". C'est une subtilité du C++ pas terrible :(.
- Un header C++ prend l'extension .hh ou .hpp, et non .h qui est reservé au C.
- Les commentaires sont un peu moyens. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/ecrire-de-bons-commentaires