BEAT DETECTION

HACKANDROID Messages postés 103 Date d'inscription mardi 12 juillet 2011 Statut Membre Dernière intervention 3 janvier 2013 - 1 sept. 2011 à 22:32
barsichou Messages postés 1 Date d'inscription mercredi 17 août 2011 Statut Membre Dernière intervention 2 septembre 2011 - 2 sept. 2011 à 16:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53536-beat-detection

barsichou Messages postés 1 Date d'inscription mercredi 17 août 2011 Statut Membre Derniè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és 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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 :(.

- 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
Rejoignez-nous