Remarques sur la version "Août 26 (29/08/2024)":
Vous n'avez toujours pas compris à quoi servent les fichiers d'en-tête (.h).
Ce n'est pas un dépotoir où on ajoute tout un bordel pour que le .cpp compile.
C'est un endroit où on déclare ce qui sera implémenté/défini dans le .cpp.
Cas pratique :
Vous avez transféré de film.cpp à film.h tout un bordel de déclaration qui n'ont rien à voir avec film.cpp.
Par exemple la déclaration de la fonction "test_date_tiret_sp_etc(wchar_t d)".
Cette fonction n'est pas définie dans film.cpp mais dans utils.cpp.
Cette déclaration ne doit pas être "transféré" dans film.h mais dans utils.h.
Et vous devez ajouter un '#include "utils.h"' dans film.cpp pour que le code dans ce fichier ( film.cpp) puisse utiliser les fonctions qui ont été déclarées dans utils.h et implémenté dans utils.cpp.
Appliquez le même résonnement pour chaque fonction du merdier que vous baladez de fichier .cpp en fichier .h qui ne correspondent pas à :
"Je déclare les fonctions dans un fichier XXX.h QUE les fonctions qui sont implémentées dans XXX.cpp"
(il y a des exceptions au mantra précédent, mais vous n'êtes clairement pas dans ces cas d'exception)
Remarques :
- Un fichier XXX.cpp qui n'inclus pas le fichier XXX.h, c'est très suspect.
- Un fichierXXX.h n'inclus que les fichiers nécéssaires à la compréhension, par le compilateur, des déclarations du fichier XXX.h, et pas les fichiers nécessaira à la compilation du fichier XXX.cpp.
=> Il doit avoir beaucoup moins de #include dans les fichiers d'en-tête (.h) que dans les fichiers .cpp.
Le "!", c'est que vous avez compris pourquoi votre code ne fonctionne pas et que mes propositions fonctionnent, ou est-ce que vous êtes toujours dans le brouillard ?Mais :
Donc : abc.[2008] ou abc.[2008-] ou abc.[2008-2010]
Exemple :
Titre : Andor [2022-] (sur Disney : 12+) 45min 4,2/5
et pas :
Titre : Andor [2022] (sur Disney : 12+) 45min 4,2/5
Ok !
Je reposte le code de m'a réponse du "28/08/2024, 23h05" :
(J'ai déjà expliqué l'algorithme implémenté dans cette fonction dans ma précédente réponse)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 std::wstring Serie::format_Annees() const { if (m_f_anneesProduction.first && m_f_anneesProduction.second) { return m_keyColor[0] + L" [" + m_valuesColor + std::to_wstring(m_f_anneesProduction.first.value()) + m_keyColor[1] + L'-' + m_valuesColor + std::to_wstring(m_f_anneesProduction.second.value()) + m_keyColor[0] + L']' + m_valuesColor; } else if (m_f_anneesProduction.first) { return m_keyColor[0] + L" [" + m_valuesColor + std::to_wstring(m_f_anneesProduction.first.value()) + m_keyColor[1] + L'-' + m_keyColor[0] + L']' + m_valuesColor; } else { std::pair<int, int> anneesDiffusion = calculer_Annees_Diffusion(); return m_keyColor[0] + L" [" + m_valuesColor + std::to_wstring(anneesDiffusion.first) + m_keyColor[1] + L'-' + m_valuesColor + std::to_wstring(anneesDiffusion.second) + m_keyColor[0] + L']' + m_valuesColor; } }
Pouvez-vous être plus précis, SVP ?et :
Star Wars : Episode VII - Le réveil de la force
et pas :
Star Wars - Episode VII - Le réveil de la force
Voilà !!!}
Dans le dépôt GuiHub, il n'y a que "Star Wars - Episode VII - Le réveil de la force" en noms de fichier.
Il y a "Star Wars: Episode VII - The Force Awakens" dans le fichier ".\Star Wars - Episode VII - Le réveil de la force.(2015-12-16)\Titre original.txt" et la fonction "initialiser_Titre_Original" fait très "bien le boulot" de découpage.
Donc, c'est quoi le problème ???
Remarques sur la version "Août 27 (30/08/2024)":
Toujours les mêmes bêtises sur l'utilité des fichiers d'en-têtes.
Je ne vois pas où est la difficulté ?Mais : (fim.cpp)
Marches pas !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (nomFichier == L"Making-of.txt") { <s>////</s>initialiser_Making_of(cheminFichier); }
Pouvez-vous être plus précis, SVP ?
Votre code :
Le compilateur gueule parce qu'il ne connait pas la fonction "initialiser_Duree".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void Film::initialiser_Making_of(std::filesystem::path const& cheminFichier) { auto nomFichier = cheminFichier.wstring(); assert(nomFichier.length() > 0 && L"Nom de fichier vide"); std::vector<std::wstring> contenu = lire_fichierTxt(cheminFichier.wstring(), { L"\n" }); assert((contenu.size() != 0)); if (contenu.size() > 0) { m_making_of_duree = initialiser_Duree(contenu[0]); contenu.erase(contenu.begin()); if (contenu.size() > 0) { m_making_of_resume = contenu; m_making_of = true; } } }
Et c'est normal, car on a correctement renommé et refactoré cette fonction pour qu'elle soit plus générique en "extraire_Duree_DepuisUneLigneDUnFichier".
Résultat :
Et la signature de la fonction "extraire_Duree_DepuisUneLigneDUnFichier" vous incite à utiliser un "std::optional<long>" plutôt qu'un simple long.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void Film::initialiser_Making_of(std::filesystem::path const& cheminFichier) { auto nomFichier = cheminFichier.wstring(); assert(nomFichier.length() > 0 && L"Nom de fichier vide"); std::vector<std::wstring> contenu = lire_fichierTxt(cheminFichier.wstring(), { L"\n" }); assert((contenu.size() != 0)); if (contenu.size() > 0) { m_making_of_duree = extraire_Duree_DepuisUneLigneDUnFichier(contenu[0]).value(); contenu.erase(contenu.begin()); if (contenu.size() > 0) { m_making_of_resume = contenu; m_making_of = true; } } }
Ce qui serait un bien meilleur type pour le "champ m_making_of_duree".
Une "bonne" conception : Rendre facile les bonnes utilisations et difficiles les mauvaises utilisations. (ici, être obligé d'utiliser la fonction "value")
Partager