https://github.com/laurentbouleau/Exemple : Mars 10
Ok ! Noté:D
Merci8-):?
Version imprimable
https://github.com/laurentbouleau/Exemple : Mars 10
Ok ! Noté:D
Merci8-):?
Votre affichage de la saison 2 n'est pas "cohérent" parce que vous cherchez à initialiser le champ "episode" à 2 endroits différents dans le constructeur d'Episode.
Il y a la partie "simple", de mon "cru", qui prend les informations dans le nom du fichier, au début du constructeur.
Mais vous avez maintenu votre code peu fiable dans la seconde partie du constructeur.
Résultat, l'affichage de la seconde saison déconne.
Pourquoi ne pas supprimer tout ce code fragile et le remplacer par quelques lignes simples, qui ne font pas doublon avec la première partie ?
Utilisez le débugueur pour voir concrètement le problème du champ "episode" écrasé par votre code superfétatoire.
https://github.com/laurentbouleau/Exemple : Mars 11
Ok ou pas ?
Avec :
et :Code:
1
2
3
4
5
6
7
8 struct Saison_Episode { friend struct Episode; std::wstring titre; std::wstring deux_points; std::wstring sous_titre; unsigned short int numero{ 1 }; };
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 void Episode::Print() { if (affichage_Print_actif) { std::wstring wstr; bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode); if (chiffre_et_point_ou_pas) { wstr = std::to_wstring(saison); wstr += keyColor[1] + L'x' + valuesColor; wstr += std::to_wstring(episode); wstr += keyColor[1] + L" : " + valuesColor; } wstr += keyColor[1] + titre + valuesColor; if (deux_points != L"") wstr += deux_points + keyColor[1] + sous_titre + valuesColor; if (fichier_pas_zero) { saison_episode.numero = 1; wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde / 60) + keyColor[1] + min + L')' + valuesColor; } else { saison_episode.numero++; wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(saison_episode.numero) + keyColor[1] + L']' + valuesColor; } wstr += keyColor[1] + L" : " + valuesColor; wstr += Print_Date_ou_Dates(dates_de_diffusion); // phrases if (fichier_pas_zero)//titre != L"") wstr += L"\r\n" + phrases; std::wcout << wstr << std::endl; } }
Non, vous ne simplifiez pas votre code.Citation:
Ok ou pas ?
Vous gardez des bouts de code avec des noms de variables complètement abscons. (exemple, la double détermination du numéro d'épisode : dans le nom du fichier/dans le contenu du fichier)
Vous vous noyez dans votre propre difficulté.
SIMPLIFIEZ !!!
"Saison_Episode", ça veut dire quoi ?Citation:
Code:
1
2
3
4
5
6
7
8 struct Saison_Episode { friend struct Episode; std::wstring titre; std::wstring deux_points; std::wstring sous_titre; unsigned short int numero{ 1 }; };
A part une association entre une saison et un épisode, je vois pas.
Si c'était juste une association, il n'y aurait que 2 champs, une référence vers une saison et une référence vers un épisode, ce n'est pas le cas ici.
Donc c'est quoi le rôle de "Saison_Episode", ET NOMMEZ LA EN FONCTION DE CE ROLE !!!
"friend" ? vraiment ? vous n'avez pas encore à vous soucier des problèmes de visibilité/abstraction, ce "friend" n'a rien à faire là pour l'instant.
"titre" et "sous_titre" sont des noms de champs avec un "sens", mais "deux_points", c'est quoi le rapport ???
"numero", c'est ambigu, car "Saison_Episode", on ne sait pas ce que sait.
Moi, ce que je comprends, c'est qu'il y a la notion de saison, d'épisode et de diffusion d'un épisode, et je ne vous rien dans votre modèle qui encapsule une diffusion.
Avant d'essayer d'afficher des trucs avec 10 champs avec des noms à coucher dehors, commencez par "modéliser" les types d'objets de votre problématique.
Comme, par exemple :
Une "Serie" qui contient un ensemble de saisons, chaque saison contenant un ensemble d'épisodes, chaque épisode contenant un ensemble de diffusions.
C'est après, et avec le minimum de complexité que vous essayeriez de construire une fonction "Print".
"fichier_pas-zero", "Print_Titre_chiffre_et_point_ou_pas", "affichage_Print_actif" sont des exemples de ces champs/fonctions qui n'ont pas de noms qui correspondent à leur "utilité" ou sont totalement inutile.
SIMPLIFIEZ !!!
(utilisez la fonction tamplate "wstring_format" pour rendre votre code plus lisible, avec des constantes de formatage explicites, et pas truffé de concaténation de chaines redondantes )
Bonjour,
L'aphasique !!!
Numero ===> 2 et 3
Pièce jointe 652550
Quoi faire ?
Comment faire ? Les noms ? Et les auxiliaires de vie ! Elles comprennent pas !!!Citation:
"fichier_pas-zero", "Print_Titre_chiffre_et_point_ou_pas", "affichage_Print_actif" sont des exemples de ces champs/fonctions qui n'ont pas de noms qui correspondent à leur "utilité" ou sont totalement inutile.
SIMPLIFIEZ !!!
Et vous : les noms ? Expliqué-moi ? (fichier_pas-zero, Print_Titre_chiffre_et_point_ou_pas, affichage_Print_actif...) !
Merci beaucoup:roll:
L'affichage que vous avez entouré en rouge provient du passage dans la partie "else" du code qui précède.Citation:
Code:
1
2
3
4
5
6
7
8
9
10
11 if (fichier_pas_zero) { saison_episode.numero = 1; wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde / 60) + keyColor[1] + min + L')' + valuesColor; } else { saison_episode.numero++; wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(saison_episode.numero) + keyColor[1] + L']' + valuesColor; }
Donc parce que le champ "fichier_pas_zero" est à Faux/false.
Malgré le nom du champ assez obscure, Visual Studio nous indique que ce champ n'est initialisé que dans le constructeur d'un Episode, quand le fichier ne contient aucune donnée.
On est dans le cas où il y a, dans le répertoire "Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga/2021-11-02/", les fichiers "1x1.2021-07-16_08-01_.txt", "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt", en plus d'autres ne commençant pas "1x1." (donc pas le même épisode).
De ce que j'essaye de comprendre de votre nomenclature de fichiers, c'est 3 fichiers commençant par "1x1." représentent des diffusions de l'épisode 1 de la saison 1.
Les fichiers "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt" sont vides, mais comme cela semble être des (re)diffusions, le contenu aurait été le même que celui du "1x1.2021-07-16_08-01_.txt".
Techniquement, ces 3 fichiers auraient pu être "fusionnés" en un fichier nommé "1x1.2021-07-16_08-01_2024-03-22_24.txt" (si je ne me trompe pas dans ce "calcul").
Si je ne me trompe pas sur cette nomenclature, vous ne pouvez plus juste vous servir d'un chemin vers un fichier pour créer un épisode, car, ici, il y a 3 fichiers pour le même épisode.
Donc, quand vous énumérez les fichiers d'un répertoire "saison" vous devriez stocker les informations dans une structure de données adaptées, comme un dictionnaire, avec comme clé : le numéro de l'épisode.
Et une fois tous les fichiers du répertoire "saison" ont été énumérés, utilisez la structure de données contenant les informations pour créer chaque épisode avec toutes les informations qui le concerne.
Et donc, pas besoin d'un champ "fichier_pas_zero" mystérieux ni d'une horrible variable globale "saison_episode" qui récupèrent n'importe quoi, n'importe comment, n'importe quand.
FAITES SIMPLE !!!!
Si vous ne pouvez pas justifier un champ ou une variable, c'est qu'ils sont en trop, et on dégage.
Donc, vous dégagez fissa "fichier_pas_zero" et autres "saison_episode", à moins que vous sachiez précisément à quoi ils servent.
C'est vous qui devriez être à même de nous expliquer à quoi elles servent.Citation:
Et vous : les noms ? Expliqué-moi ? (fichier_pas-zero, Print_Titre_chiffre_et_point_ou_pas, affichage_Print_actif...) !
"fichier_pas_zero", ça indique juste si un fichier était vide mais n'a aucun sens au niveau de l'épisode, dont les informations peuvent venir de plusieurs fichiers, donc ça ne sert à rien !
"Print_Titre_chiffre_et_point_ou_pas" "sert" à savoir s'il faut afficher la partie "numéro de saison x numéro d'épisode : " en préfixe d'un affichage, mais pourquoi ce n'est pas systématiquement affiché ? Donc s'il n'y a pas de raison, on dégage !!!
Dans les faits, ça teste si le numéro d'épisode est bien renseigné, donc on cache une erreur de programmation en amont avec du code supplémentaire qui complexifie tout. NON, c'est le problème EN AMONT qu'il faut régler et pas le cacher sous le tapis.
J'ai l'impression que beaucoup de complexité est là pour "patcher" des erreurs de programmation en amont.
"affichage_Print_actif" : comme déjà indiqué plusieurs fois, c'est un champ complètement inutile qui, en plus, est utilisé à un endroit complètement illogique, ON DEGAGE.
P.S. Utilisez "wstring_format" (avec des formats "const wstring") et les expressions régulières pour simplifier votre code !!!
Ben non !!!Citation:
Techniquement, ces 3 fichiers auraient pu être "fusionnés" en un fichier nommé "1x1.2021-07-16_08-01_2024-03-22_24.txt" (si je ne me trompe pas dans ce "calcul").
Exemple :
Citation:
1x1.2021-07-16_08-01_.txtCitation:
1. La phrase : verbre
148Min
À la mort du duc d'Halstead, son second fils hérite de tout son patrimoine : son titre, sa maison et ses terres, mais aussi une montagne d'ennuis.
Citation:
1x1.2024-03-22_.txtCitation:
L""
C'est comme sait !!!Citation:
1x1.2024-03-24.txtCitation:
L""
Et :
ouCitation:
1x1.2021-07-16_08-01_.txt
égal :Citation:
1x1.2024-03-22_.txt
pas-à-pas
et/ou
préquel ou pas !
et/ou
préquel
???
---------------
Pièce jointe 652561
??? Erreur ou pas ou...
---------------Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 void Episode::Print() { std::wstring wstr; bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode); if (chiffre_et_point_ou_pas) { wstr = std::to_wstring(saison) + keyColor[1] + L'x' + valuesColor + std::to_wstring(episode) + keyColor[1] + L" : " + valuesColor; } wstr += keyColor[1] + titre + valuesColor; if (deux_points != L"") wstr += deux_points + keyColor[1] + sous_titre + valuesColor; if (numero == 1) { wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde / 60) + keyColor[1] + min + L')' + valuesColor; } else { wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(numero) + keyColor[1] + L']' + valuesColor; numero++; } wstr += keyColor[1] + L" : " + valuesColor; wstr += Print_Date_ou_Dates(dates_de_diffusion); // phrases if (numero == 1)//titre != L"") wstr += L"\r\n" + phrases; std::wcout << wstr << std::endl; }
Ok !Citation:
"affichage_Print_actif" : comme déjà indiqué plusieurs fois, c'est un champ complètement inutile qui, en plus, est utilisé à un endroit complètement illogique, ON DEGAGE.
---------------
https://github.com/laurentbouleau/Exemple : Mars 12
Merci vraiment:aie::weird::calim2:
OK alors donnez-nous l'affichage attendu si vous avez ces 3 fichiers.Citation:
Ben non !!!
Quel seraient les différences si vous n'aviez qu'un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" avec le même contenu que "1x1.2021-07-16_08-01_.txt" ?
Que signifie "concrètement" ces lignes "1x1 : [2] : 22/03/2024" et "1x1 : [2] : 24/03/2024" dans la copie d'écran de votre dernier post ?
L'apparition des chaines "[pas-à-pas]", "[préquel ou pas !]" ou encore "[préquel]" me semblent complètement arbitraires.
Pouvez-vous expliquer concrètement ce que cela veut dire et quand elles doivent apparaitre dans l'affichage ?
C'est vous qui savez à quoi devrait ressembler l'affichage à la fin, non ?Citation:
??? Erreur ou pas ou...
Qu'est-ce qui n'est pas conforme à vos attentes dans cette copie d'écran ?
Vous avez remplacé la constante globale "saison_episode" par le champ "numero", c'est très bien.
(vous vous en servez encore de "saison_episode" ligne 321 de serie.cpp, VIREZ-MOI CA !!!)
Mais c'est quoi la différence entre le champ "episode" et le champ "numero" ?
Pour le coup, "numero" semble un bien meilleur nom qu'"episode".
N'ayez pas des champs en trop, ça complexifie inutilement le code.
Dans le nom de fichier "1x1.2021-07-16_08-01_.txt", le deuxième 1 (entre le "x" et le "."), c'est bien le numéro de l'épisode, non ?
Par construction, il est obligatoire dans le nom du fichier mais vous vous obstinez aussi à vouloir le lire dans la première ligne du fichier, mais il n'apparait pas systématique.
Pourquoi vous prendre la tête avec le contenu du fichier alors que le nom suffit ?
Si l'on supprime le champ "episode" pour le remplacer par le champ "numero", vous pouvez simplement remplacer la ligne 208 de serie.cpp :
par :Code:episode = std::stoi(match[filename_numero_episode_index]);
Tout le reste du code qui manipule "numero" en écriture devrait disparaitre ou juste vérifier que le contenu du fichier est cohérent avec le nom du fichier.Code:numero = std::stoi(match[filename_numero_episode_index]);
Et le "return" ligne 217 de serie.cpp, c'est une connerie, faites un effort pour rendre simple votre code.
Vous avez commencé à utiliser les expressions régulières mais de manières assez maladroites, ce qui rend le code verbeux :
Voici une proposition de simplification du constructeur d'épisode (en faisant l'assertion qu'un semble chemin de fichier permet de construire correctement un objet "Episode") :
Et votre "Episode:: Print()" me semble toujours trop complexe :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 Episode::Episode(fs::path const& cheminFichier) { // ([[:digit:]]+)x([[:digit:]]{1,3})\\.(((([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})))(_?))+)(\\s(.+))? const std::wstring numero_saison_format = L"([[:digit:]]{1,2})"; // saison const std::wstring sep_numero_saison = L"x"; // x const std::wstring numero_episode_format = L"([[:digit:]]{1,3})"; // episode const std::wstring sep_episode_saison = L"\\."; //. const std::wstring date_year_month_day_format = L"([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})"; const std::wstring date_month_day_format = L"([[:digit:]]{2})-([[:digit:]]{2})"; const std::wstring date_day_format = L"([[:digit:]]{2})"; const std::wstring stream_format = L"(\\s(.+))?"; const std::wstring dates_format = L"((" + date_year_month_day_format + L"|" + date_month_day_format + L"|" + date_day_format + L")(_?))"; const int dates_full_match_index = 0; const int dates_date_year_month_day_year_index = dates_full_match_index + 3; const int dates_date_year_month_day_month_index = dates_date_year_month_day_year_index + 1; const int dates_date_year_month_day_day_index = dates_date_year_month_day_month_index + 1; const int dates_date_month_day_month_index = dates_date_year_month_day_day_index + 1; const int dates_date_month_day_day_index = dates_date_month_day_month_index + 1; const int dates_date_day_day_index = dates_date_month_day_day_index + 1; const int dates_someFlag_index = dates_date_day_day_index + 2; const std::wregex filename_format_rg{ numero_saison_format + sep_numero_saison + numero_episode_format + sep_episode_saison + L"(" + dates_format + L"+)" + stream_format }; const int filename_full_match_index = 0; const int filename_numero_saison_index = filename_full_match_index + 1; const int filename_numero_episode_index = filename_numero_saison_index + 1; const int filename_dates_index = filename_numero_episode_index + 1; const int filename_date_year_month_day_year_index = filename_dates_index + 2; const int filename_date_year_month_day_month_index = filename_date_year_month_day_year_index + 1; const int filename_date_year_month_day_day_index = filename_date_year_month_day_month_index + 1; const int filename_date_month_day_month_index = filename_date_year_month_day_day_index + 1; const int filename_date_month_day_day_index = filename_date_month_day_month_index + 1; const int filename_date_day_day_index = filename_date_month_day_day_index + 1; const int filename_someFlag_index = filename_date_day_day_index + 2; const int filename_stream_index = filename_someFlag_index + 2; auto nomFichier = cheminFichier.filename().wstring(); assert(nomFichier.length() > 0 && L"Nom de fichier Episode vide"); auto stem = cheminFichier.stem().wstring(); assert((stem.length() > 9) && L"Nom de fichier Episode trop court pour avoir au moins une date"); assert(std::isdigit(stem[0]) && L"Nom de fichier Episode ne commençant pas par un nombre"); saison = std::stoi(stem); assert((saison <= 1000) && L"x <= 1000 !!!"); assert((stem.find(L"x", 0) != std::wstring::npos) && L"Saison::afficher_Episode() : x !!!"); assert(std::regex_match(stem, filename_format_rg) && L"Le nom du fichier n'est pas valide"); std::wsmatch match; auto str = stem; std::regex_match(str, match, filename_format_rg); std::wsmatch dates_match; auto dates_str = match[filename_dates_index].str(); while (std::regex_search(dates_str, dates_match, std::wregex{ dates_format })) { if (dates_match[dates_date_year_month_day_year_index].matched) { auto year = std::stoi(dates_match[dates_date_year_month_day_year_index]); auto month = std::stoi(dates_match[dates_date_year_month_day_month_index]); auto day = std::stoi(dates_match[dates_date_year_month_day_day_index]); assert(checkyear(year)); assert(checkmonth(month)); assert(checkday(month, day, year)); DateRecord dr{ {0,0,0,day,month - 1,year - 1900} }; dates_de_diffusion.emplace_back(dr); } else if (dates_match[dates_date_month_day_month_index].matched) { assert(dates_de_diffusion.size() > 0 && L"Utilisation d'un format mois-jour sans avoir d'année déduite."); auto month = std::stoi(dates_match[dates_date_month_day_month_index]); auto day = std::stoi(dates_match[dates_date_month_day_day_index]); auto lastDateRecord = dates_de_diffusion.back(); auto last_year = lastDateRecord.date.tm_year + 1900; assert(checkmonth(month)); assert(checkday(month, day, last_year)); DateRecord dr{ {0,0,0,day,month - 1,last_year - 1900} }; dates_de_diffusion.emplace_back(dr); } else if (dates_match[dates_date_day_day_index].matched) { assert(dates_de_diffusion.size() > 0 && L"Utilisation d'un format jour sans avoir de mois et d'années déduits."); auto day = std::stoi(dates_match[dates_date_day_day_index]); auto lastDateRecord = dates_de_diffusion.back(); auto last_year = lastDateRecord.date.tm_year + 1900; auto last_month = lastDateRecord.date.tm_mon + 1; assert(checkday(last_month, day, last_year)); DateRecord dr{ {0,0,0,day,last_month - 1,last_year - 1900} }; dates_de_diffusion.emplace_back(dr); } else { assert(true && L"format de date d'épisode inconnu."); } if (dates_match[dates_someFlag_index].matched) { dates_de_diffusion.back().someFlag = true; } dates_str = dates_match.suffix().str(); } if (match[filename_stream_index].matched) { streaming = match[filename_stream_index]; } numero = std::stoi(match[filename_numero_episode_index]); std::vector<std::wstring> t = lire_fichierTxt(cheminFichier.wstring(), { L"\n" }, false); const std::wregex first_line_format_rg{ L"([[:digit:]]*)(\\.?)(.+?) ?((\\-|:) (.+))?" }; std::wsmatch first_line_match; if (std::regex_match(t[0], first_line_match, first_line_format_rg)) { if (first_line_match[1].matched && first_line_match[1].length()>0) assert(numero == std::stoi(first_line_match[1]) && L"Le numero d'épisode dans le nom du fichier et dans le fichier ne correspondent pas."); if (first_line_match[3].matched) titre = first_line_match[3]; if (first_line_match[6].matched) sous_titre = first_line_match[6]; } else { titre = t[0]; } if (t.size() > 1) { initialiser_duree(t[1]); for (auto j = 2; j < t.size(); j++) { if (j > 2 && phrases.back() != L' ') { phrases += L" "; } phrases += t[j]; } } }
Vous pouvez séparer les calculs comme je l'ai fait pour le "sous_titre" pour rendre le code encore plus lisible, sans ces satanées "+=" dans tous les coins avec des "if" abscons.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 void Episode::Print() { const std::wstring print_format = L"%d" + keyColor[1] + L'x' + valuesColor + L"%d" + keyColor[1] + L" : " + valuesColor + keyColor[1] + L"%s" + valuesColor + L"%s" + keyColor[1] + L" (" + valuesColor + L"%d" + keyColor[1] + L" min)" + valuesColor + keyColor[1] + L" : " + valuesColor + L"%s"; auto sous_titre_str = sous_titre.length() > 0 ? L" : " + keyColor[1] + sous_titre.c_str() + valuesColor : L""; std::wstring res = wstring_format(print_format, saison, numero, titre.c_str(), sous_titre_str.c_str(), duree_en_seconde / 60, Print_Date_ou_Dates(dates_de_diffusion).c_str()); if (phrases.length() > 0) res += L"\r\n" + phrases; std::wcout << res << std::endl; }
Bonjour,
C'est le même épisode que j'ai vu plusieurs fois. Donc, on ne peux pas fusionner.Citation:
OK alors donnez-nous l'affichage attendu si vous avez ces 3 fichiers.
Quel seraient les différences si vous n'aviez qu'un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" avec le même contenu que "1x1.2021-07-16_08-01_.txt" ?
Normalement, ça devrait être [2] et [3] car c'est la 2ème et la 3ème fois que j'ai regardé cet épisode.Citation:
Que signifie "concrètement" ces lignes "1x1 : [2] : 22/03/2024" et "1x1 : [2] : 24/03/2024" dans la copie d'écran de votre dernier post ?
Je me rends compte que le mot "préquel" ne signifie pas ce que je pensais, donc je vais le changer.Citation:
L'apparition des chaines "[pas-à-pas]", "[préquel ou pas !]" ou encore "[préquel]" me semblent complètement arbitraires.
Pouvez-vous expliquer concrètement ce que cela veut dire et quand elles doivent apparaitre dans l'affichage ?
[pas-à-pas] veut dire que j'ai visionné l'épisode en plusieurs fois, de la date 1 à la date 2.
[préquel ou pas !] veut dire que j'ai commencé à visionner l'épisode, mais que j'ai abandonné (trop dur) – Je vais remplacer par "stop ou pas". [1x1...]
[préquel] veut dire que j'ai abandonné le visionnage de l'épisode, mais que je vais peut-être le reprendre – Je vais remplacer par "à suivre" [1x2..., 1x3... etc]
(Réponses élaborées avec l'orthophoniste)
Merci beaucoup:D
Ah, Ok, ce n'est pas, ou pas que des diffusions, c'est plutôt ou aussi des visionnages, c'est ça ?
Ou est-ce que les fichiers "non vide" sont des diffusions et les fichiers vides sont des visionnages ?
"dates_de_diffusion" est un champ et aussi un nom de paramètre, s'il n'y pas de "date de diffusion" mais que des dates de visionnages, vous devriez renommer ces champs et paramètres en "dates_de_visionnage", par exemple.
S'il y a les 2 notions, des dates de diffusion et des dates de visionnage, il ne faudrait pas les mélanger.
Ca veut dire qu'on n'a pas que des dates de visionnages dans les noms de fichiers, sinon, on pourrait les fusionner sans problème, on est d'accord ?Citation:
C'est le même épisode que j'ai vu plusieurs fois. Donc, on ne peux pas fusionner.Citation:
Citation:
OK alors donnez-nous l'affichage attendu si vous avez ces 3 fichiers.
Quel seraient les différences si vous n'aviez qu'un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" avec le même contenu que "1x1.2021-07-16_08-01_.txt" ?
Si vous pouvez nous donner l'affichage attendu si on a ces 3 fichiers : ("1x1.2021-07-16_08-01_.txt","1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt"), ça pourrait simplifier notre compréhension de vos problèmes.
Ok, ce n'est donc pas un "épisode" qu'on affiche (avec ces dates de diffusion) mais un "épisode" (avec des dates de diffusions ou pas ?) et ses dates de visionnages.Citation:
Normalement, ça devrait être [2] et [3] car c'est la 2ème et la 3ème fois que j'ai regardé cet épisode.Citation:
Que signifie "concrètement" ces lignes "1x1 : [2] : 22/03/2024" et "1x1 : [2] : 24/03/2024" dans la copie d'écran de votre dernier post ?
Vous ne devriez donc pas créer un "Episode" pour chacun des fichiers correspondants, mais une date de visionnage que vous stockeriez dans l'objet Episode correspondant.
Sauf erreur, vous ne pouvez pas savoir à l'avance si le fichier correspond à une ou plusieurs diffusions ou s'il correspond à un ou plusieurs visionnages, juste avec son nom, si ?
Si c'est le cas, vous ne pouvez pas construire automatiquement un Episode pour chaque fichier qui respect "le format" que vous nous avez donné.
Il faut modifier le code qui scanne les répertoires pour qu'il analyse le contenu du fichier avant de demander la création d'un Episode, ou la création d'un ensemble de dates de visionnage d'un épisode.
Heu, il serait où le premier visionnage dans ce cas ???Citation:
Normalement, ça devrait être [2] et [3]
L'ordre n'est pas une information "intrinsèque" (interne) d'une date de diffusion.
Si vous stockez les dates de visionnage dans un épisode chronologiquement, dans un objet "Episode", son numéro d'ordre chronologique sera automatiquement fourni par l'objet "Episode" qui connait l'ordre du visionnage, pas la date elle-même.
Ne cherchez pas à connaitre l'ordre du visionnage au moment de la création de la date de visionnage, mais uniquement lors de l'affichage de l'Episode, qui connait TOUTES les dates de visionnage et leur ordre chronologique.
Tout ceci est lié à des dates de visionnages, pas à des dates de diffusion.Citation:
[pas-à-pas] veut dire que j'ai visionné l'épisode en plusieurs fois, de la date 1 à la date 2.
[préquel ou pas !] veut dire que j'ai commencé à visionner l'épisode, mais que j'ai abandonné (trop dur) – Je vais remplacer par "stop ou pas". [1x1...]
[préquel] veut dire que j'ai abandonné le visionnage de l'épisode, mais que je vais peut-être le reprendre – Je vais remplacer par "à suivre" [1x2..., 1x3... etc]
Si les dates de diffusion "n'existent pas" et qu'il n'y a que des dates de visionnage, ces dates proviennent de plusieurs fichiers et vous ne regroupez pas les dates de visionnage provenant de plusieurs fichiers dans un seul "Episode", donc difficile de pouvoir "correctement" faire une analyse sur l'ensemble des visionnages.
Y a-t-il une notion de "séquence de visionnage" qui permet de "voir" un même épisode, une fois en une fois (séquence d'1 date de visionnage) et pour le même épisode d'avoir une autre séquence de "date de visionnage" sur plusieurs jours, par exemple ?
Si oui, il faudra implémenter ce concept de "séquence de visionnage" dans votre conception.
Bonsoir,
Compliqué a dire ! Et, oui, c'est vraiment !
Exemple : [pas-à-pas]Citation:
[pas-à-pas] veut dire que j'ai visionné l'épisode en plusieurs fois, de la date 1 à la date 2.
Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga/2021-11-02/Ok ?1x1.2021-07-16_08-01_.txt1. La phrase : verbre
148Min
À la mort du duc d'Halstead, son second fils hérite de tout son patrimoine : son titre, sa maison et ses terres, mais aussi une montagne d'ennuis.1x2.2021-07-18_18_18 France 5.txtBetter Call Saul.[2015-2022]/2015-02-092. Tackle Tommy: woo woo
63 min
Les aristos et leur garde-chasse traquent une nouvelle sorte de proie. Susie embauche de l'aide pour faire le ménage, et le manoir d'Halstead reçoit une sacrée visite.1x03.2024-02-02_02.txt3. Nacho
47 min
Pour blanchir son nouveau client et sauver sa peau par la même occasion, Jimmy doit orienter la police vers une autre piste, tout aussi crédible.
Merci d'avance:aie:
Après : l'orthophoniste et moi : Mardi 02/04/2024 !
Merci
On va commencer à attaquer dans le dur et pas juste "se battre" contre la syntaxe du C++.
Il faut commencer à prendre du recul pour avoir une conception qui tienne un peu la route.
Pour cela, il faut commencer par l'expression du besoin : "Pourquoi avez-vous besoin de ce programme ?".
C'est important pour rester focus sur l'objectif.
Sans ça, on (ceux qui essayent de vous aider) n'est un peu obliger de jouer aux astrologues et essayer de deviner vos objectifs.
Si on comprend bien, l'arborescence des fichiers que votre programme "scanne", ce n'est que des "séquence de séances de visionnage" de films et de série.
et un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" c'est UNE séquence de séances de visionnage (sur plus de 2 ans) alors que 3 fichiers : "1x1.2021-07-16_08-01_.txt", "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt" correspondent à 3 "séquences de séances de visionnage" du même épisode mais distinctes les une des autres (la première avec des séances qui s'étendent sur 15 jours, la 2ème séquence avec une ou plusieurs sessions de visionnage mais dans la même journée, idem pour la 3ème séquence à la 2ème).
Une séquence de séances de visionnage, c'est la liste des dates où vous avez regardé un bout de l'épisode en reprenant à partir du moment de la fin de la session de visionnage d'avant, dans la même séquence.
Il y a un fichier par séquence de séances de visionnage. Mais une séquence peut avoir plusieurs séances.
Ok ???
Si c'est bien le cas, la conception serait un peu différente :
Une série contient des Saisons, des Saisons contiennent des Episodes, les épisodes contiennent plusieurs séquences de séances de visionnage, chaque séquence contient plusieurs séances de visionnage.
C'est Ok pour vous comme conception ?
Dans ce cas un fichier ne correspond pas à un épisode mais à une séquence de séances de visionnage.
Donc le code ligne 613 à 629 de serie.cpp ci-après (numéros approximatifs car j'ai fais de modification pour présenter la version "simplifié" posté hier) :
(remarquez que l'utilisation d'une expression régulière pourrait éviter d'avoir 2 fois le même code et permettrait de faire un "if" bien plus simple et clair)Citation:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 if ( (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9') && nomFichier[1] == L'x' ) { Creer_Episode(cheminFichier); return; } if ( (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9') && (std::isdigit(nomFichier[1])) && nomFichier[2] == L'x' ) { Creer_Episode(cheminFichier); return; }
On pourrait remplacer ce code avec un truc comme :
C'est un code qui ne compilera pas mais si :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 if(std::regex_match(nomFichier, std::wregex{L"([[:digit:]]{1,2})x(.)+"})) { SequenceVisionnage seq_vis{cheminFichier}; if(m_liste_episodes.existe(seq_vis.numero_episode)) { m_liste_episodes[seq_vis.numero_episode].AjouterSequenceVisionnage(seq_vis); } else { Creer_Episode(seq_vis); } }
- vous créez la classe SequenceVisionnage avec un constructeur qui prend un nom de fichier et un champ "numero_episode" contenant le numéro de l'épisode donné dans le nom du fichier,
- que vous ajoutez un champ "m_liste_episodes" dans la classe Saison capable de savoir si un épisode avec un numéro donné existe déjà (via sa fonction "existe"), d'accéder à l'épisode numéro X via l'opérateur "[]",
- que vous ajoutiez à votre classe Episode la fonction "AjouterSequenceVisionnage"
- et que "Creer_Episode" mette à jour le champ "m_liste_episodes" et prenant en entré un objet SequenceVisionnage.
En implémentant ce qu'il faut dans ces fonctions, le code compilera et fera ce qu'il faut.
Et le code n'est-il pas clair ainsi ?
Posez des questions, SVP.
Bonsoir,
Je suis fatigué ! Demain ?
Vendredi : 14h - 16h : Complexe René-Tys : La musculation (groupe handicap)
Merci:aie:
Bonsoir,
Pardon ? Ben, non !!!Citation:
et un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" c'est UNE séquence de séances de visionnage (sur plus de 2 ans)
Ben oui !!!Citation:
alors que 3 fichiers : "1x1.2021-07-16_08-01_.txt", "1x1.2024-03-22_.txt" et "1x1.2024-03-24.txt" correspondent à 3 "séquences de séances de visionnage" du même épisode mais distinctes les une des autres (la première avec des séances qui s'étendent sur 15 jours, la 2ème séquence avec une ou plusieurs sessions de visionnage mais dans la même journée, idem pour la 3ème séquence à la 2ème).
Alors à quoi correspondrait un fichier avec un nom pareil ?Citation:
Pardon ? Ben, non !!!
Merci pour ces informations qui permettent de fixer un peu le cadre du projet.
Mais, je ne vois toujours pas où est mon erreur d'interprétation de la "signification" du nom du fichier.
Mes définitions :
Un épisode : Dans la terminologie des séries télévisées, le terme « épisode » désigne plus spécifiquement chacun des segments composant une série, (Wikipédia)
Une séance de visionnage : le fait de regarder pendant un certain temps un bout de film ou d'un épisode.
Une séquence de séance de visionnage : plusieurs séances de visionnage où on reprend le visionnage où on en était resté à la séance précédente (sauf pour la première séance de la séquence où on commence le visionnage du film ou de l'épisode).
Sommes-nous d'accord sur ces définitions ?
Sinon, pouvez-vous expliquer ce qui ne va pas sur ces définitions ?
Si vous êtes d'accord avec ces définitions, pouvez-vous faire les actions que je vous ai proposé (création de la classe "SequenceVisionnage", etc...) ?
Sinon, pouvez-vous expliquer pourquoi ?
Si c'est un problème avec le langage C++ ou la conception "objet", pouvez-vous nous indiquer ce qui vous bloque ?
Citation:
et un fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" c'est UNE séquence de séances de visionnage (sur plus de 2 ans)
Ce fichier ne correspond à rien. Je n'ai pas utilisé ce type de nom de fichier.Citation:
Alors à quoi correspondrait un fichier avec un nom pareil ?
Je suis d'accord avec vos définitions.Citation:
Si vous êtes d'accord avec ces définitions, pouvez-vous faire les actions que je vous ai proposé (création de la classe "SequenceVisionnage", etc...) ?
Sinon, pouvez-vous expliquer pourquoi ?
Si c'est un problème avec le langage C++ ou la conception "objet", pouvez-vous nous indiquer ce qui vous bloque ?
Je suis d'accord pour faire les actions que vous avez demandées.
C'est très difficile pour moi de lire de longues phrases. (J'utilise le narrateur de l'ordi.)
Je voudrais le faire étape par étape.
Je vais essayer de faire la 1ère action et je vous demanderai si c'est bon, si vous en êtes d'accord.
Ensuite, je ferai la 2ème, etc.
Quand vous me faites des très longues réponses, je suis perdu.
Merci beaucoup.
(Fait avec l'aide de l'orthophoniste)
Pouvez-vous m'indiquer ce qui ne va pas dans le nom de fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" ?Citation:
Ce fichier ne correspond à rien. Je n'ai pas utilisé ce type de nom de fichier.
J'ai l'impression que ce nom de fichier est "conforme", non ?
Prenez le temps de faire chaque action.
Mais il faudra toutes les faire pour que votre projet recompile à nouveau si vous utilisez le bout de code que j'ai posté.
Mais vous pouvez créer la classe "SequenceVisionnage" pour commencer "doucement".
Bonsoir,
Ben non !Citation:
Pouvez-vous m'indiquer ce qui ne va pas dans le nom de fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" ?
J'ai l'impression que ce nom de fichier est "conforme", non ?
Parce que :
Pièce jointe 652911
Taille : 1 Ko ou 0 Ko
1x1.2021-07-16_08-01_.txt1. La phrase : verbre1x1.2024-03-22_.txt
148Min
À la mort du duc d'Halstead, son second fils hérite de tout son patrimoine : son titre, sa maison et ses terres, mais aussi une montagne d'ennuis.L""1x1.2024-03-24.txtL""1x2.2021-07-18_18_18 France 5.txt2. Tackle Tommy: woo wooEtc...
63 min
Les aristos et leur garde-chasse traquent une nouvelle sorte de proie. Susie embauche de l'aide pour faire le ménage, et le manoir d'Halstead reçoit une sacrée visite.
Ou :
The Walking Dead.[2010-2022]The Walking Dead.10 :2019-12-0610x01.2021-05-01.txt1. Les limites franchies10x01.2022-02-05.txt
52 min
Rien ne vaut un entraînement pour souder une équipe face aux rôdeurs. Mais les choses se gâtent quand des débris spatiaux attirent les survivants en territoire ennemi.L""Etc...
Ok !Citation:
Prenez le temps de faire chaque action.
Mais :
et :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 struct Saison_Episode { friend struct Episode; std::wstring titre; std::wstring deux_points; std::wstring sous_titre; unsigned short int numero; }; struct Episode { Episode(std::filesystem::path const& cheminFichier); struct Saison; friend Saison_Episode;; ...
Peux être ou pas !Code:
1
2
3
4
5 struct DateRecord { std::tm date{ 0 }; bool someFlag{ false }; };
Bien sûr : Saison_Episode ou autre ???
Plus simple ou pas ?
Ah ! Ok !Citation:
Mais il faudra toutes les faire pour que votre projet recompile à nouveau si vous utilisez le bout de code que j'ai posté.
Ok ! Noté !Citation:
Mais vous pouvez créer la classe "SequenceVisionnage" pour commencer "doucement".
Merci beaucoup:)
Je sais que ce n'est pas un fichier que vous avez mis dans votre de test, mais SI il existe dans le répertoire, il sera bien interprété comme un nom de fichier valide, non ?Citation:
Ben non !Citation:
Pouvez-vous m'indiquer ce qui ne va pas dans le nom de fichier "1x1.2021-07-16_08-01_2024-03-22_24_.txt" ?
J'ai l'impression que ce nom de fichier est "conforme", non ?
Sinon, pourquoi il ne serait pas valide ?
Mais maintenant que vous avez mentionné la notion de "séquence de séance de visionnage", on peut distinguer les 2 cas :
Celui avec les 3 fichiers :
1x1.2021-07-16_08-01_.txt
1x1.2024-03-22_.txt
1x1.2024-03-24.txt
Qui correspond à 3 séquences de séance de visionnage du même épisode.
La première séquence correspond à une séquence de séances compris entre le "2021-07-16" et le "2021-08-01"
La seconde séquence correspond à une séquence de séances le "2024-03-22" (donc peut-être une séquence de 1 séance ? ou plusieurs séances le même jour ?), mais on reprend le visionnage du début, c'est ça ?
La troisième séquence correspond à une séquence de séances le "2024-03-24" (donc peut-être une séquence de 1 séance ? ou plusieurs séances le même jour ?), mais on reprend le visionnage du début, c'est ça ?
Celui avec un seul fichiers "1x1.2021-07-16_08-01_2024-03-22_24_.txt" correspondrait à UNE seule séquence de séance de visionnage qui s'étalerait sur près de 3 ans !!!
Et dans ce cas, effectivement, les 2 cas ne correspondraient pas à la même situation/mêmes données.
Ai-je bien compris la situation ???
Pour la classe/structure "Saison_Episode", comme je vous l'ai déjà dit, je ne comprends pas ce que cette classe est sensée représentée.
Je ne vois pas son utilité, donc je la dégagerai. Mais si vous avez pensé à la créer, c'est que vous aviez une idée derrière la tête, non ?
Alors laquelle ?
Sinon, bin, on dégage (moins de code, moins de bugs)
Pour cette classe Episode, si j'ai bien compris le rôle de chaque fichier ".txt", vous ne pouvez pas créer un épisode (avec tous ces champs correctement initialisés) juste avec le chemin vers un fichier "_x_....txt".Citation:
Code:
1
2
3
4
5
6 struct Episode { Episode(std::filesystem::path const& cheminFichier); struct Saison; friend Saison_Episode;; ...
Car il vous faut plus d'informations pour savoir si le fichier correspond à un nouvel épisode à créer ou à une nouvelle séquence de séances de visionnage d'un épisode que vous avez déjà créé au sein d'une saison.
Dans ce cas, le constructeur "Episode(std::filesystem::path const& cheminFichier);" n'est plus pertinent.
Il faudrait le remplacer par un constructeur qui prendrait en paramètre un type de données plus pertinent.
Comme indiqué dans mon message du "28/03/2024, 19h53", il serait peut-être plus judicieux de passer le chemin du fichier au constructeur d'une classe "SequenceVisionnage".
L'instance de l'objet de type "SequenceVisionnage" pourrait être un argument pertinent pour le constructeur de la classe Episode.
On est d'accord que si vous n'avez pas un fichier ".txt" d'une séquence de séance de visionnage, c'est comme si l'épisode n'existait pas, OK ?
Dans ce cas, on peut remplacer la signature du constructeur d'Episode par :
Comme un Episode ne doit pas contenir une "Saison" mais être contenu dans une Saison, le champ "Saison" dans la classe Episode doit disparaitre.Code:
1
2
3 struct Episode { Episode(SequenceVisionnage const& seq_vis);
Si vous avez besoin d'accéder à la saison en partant d'un épisode, on pourra voir des mécanismes pour le faire, plus tard.
Pareil pour "friend Saison_Episode", ça dégage, car "Saison_Episode" ne sert à rien.
Le nom du type "DateRecord" indique ce que c'est, mais pas à quoi il sert. C'est pas forcement l'idéal mais comme il peut, peut-être, servir à plusieurs usages différents, vous pouvez vraisemblablement vous en servir comme base à un alias de type :
https://en.cppreference.com/w/cpp/language/type_alias
Donc un truc comme :
Permettrait d'utiliser le type "DateVisionnage" dans la classe "SequenceVisionnage", par exemple, et de vous servir d'un autre alias sur ce type "DateRecord" pour stocker une "date + someFlag" qui correspondrait à autre chose qu'une date de visionnage ailleurs dans le projet.Code:using DateVisionnage = DateRecord
Mais commencez par créer la classe "SequenceVisionnage" pour commencer "doucement".
Bonsoir,
Attention :
égal :Citation:
1x1.2021-07-16_08-01_.txt
Merci:roll:8-);)Citation:
1x1 : La phrase : verbre (148min) : 16/07/2021 et 01/08/2021 [pas-à-pas] (à suivre)
À la mort du duc d'Halstead, son second fils hérite de tout son patrimoine : son titre, sa maison et ses terres, mais aussi une montagne d'ennuis.
Bonsoir,
https://github.com/laurentbouleau/Exemple : Avril 01
Ok !
---------------------------
À-propos :
https://www.b-lolo.fr/
https://matomo.org/ : Gratuit
Mais : Extensions :
Matomo Analytics - Statistiques éthiques. Observations puissantes : marche pas !!! Avant, oui !!!
Alors :
Connect Matomo !!! Tant pis !!!
Et vous ?
Et :
ArchivesBen non !!!mars 2024
février 2024
janvier 2024
...
---------------------------
Je suis fatigué:aie:
Merci:oops:
Matomo Analytics ne semble pas gratuit, juste le test est gratuit.Citation:
À-propos :
https://www.b-lolo.fr/
https://matomo.org/ : Gratuit
Mais : Extensions :
Matomo Analytics - Statistiques éthiques. Observations puissantes : marche pas !!! Avant, oui !!!
Alors :
Connect Matomo !!! Tant pis !!!
Et vous ?
C'est pas juste la fin de la période de Test ?
Ok.Citation:
Maintenant, in faut transférer de la classe "Episode" vers la classe "SequenceVisionnage" les champs qui sont associés à une séquence de visionnage et non à un épisode comme :
- std::filesystem::path m_cheminFichier;
- std::vector<DateRecord> dates_de_visionnage{ 0 };
Changez le nom des champs pour qu'ils soient "logiques" dans leur nouveau contexte comme le champ "dates_de_visionnage" d'un épisode deviendrait logiquement un champ "m_dates" dans une "SequenceVisionnage".
Les fichiers de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" contiennent à la fois des informations sur l'épisode mais aussi des informations sur une séquence de séances de visionnages.
Vous ne devriez donc pas faire un constructeur d'Episode qui prenne un "std::filesystem::path" en paramètre, ni créer un constructeur de "SequenceVisionnage" qui prendrait en paramètre aussi un "std::filesystem::path".
Je vous conseille de gérer les informations contenues dans le nom du fichier et dans le corps du fichier dans une classe dédiées supplémentaires : "InfosVisionnage", par exemple.
Vous y ajouterez des champs pour y stocker les informations glanées dans le nom et le contenu du fichier. (m_NumeroSaison, m_NumeroEpisode, ..., m_Duree, ..., m_DatesVisionnage, ...).
Un constructeur de "InfosVisionnage" qui prendrait en paramètre un "std::filesystem::path".
Il faudra transférer une grande partie du code du constructeur d'Episode, vers le constructeur de "InfosVisionnage".
Le constructeur de "InfosVisionnage" appellera vraisemblablement le constructeur de la classe "SequenceVisionnage" pour stocker les informations associées dans un champ de type "SequenceVisionnage".
Le constructeur d'Episode prendra donc en paramètre une "InfosVisionnage" pour initialiser ses champs.
Il pourra utiliser le champ de type "SequenceVisionnage" contenu dans "InfosVisionnage" pour initialiser un champ qui listera toutes les séquences de séances de visionnage de l'épisode.
Une fois cette nouvelle classe avec le code transféré, vous pourrez changer les lignes 694 à 710 de serie.cpp
(Pourquoi la fonction se nomme "void Saison::afficher_Fichier", MORT BLEU !!!)Citation:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 if ( (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9') && nomFichier[1] == L'x' ) { Creer_Episode(cheminFichier); return; } if ( (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9') && (std::isdigit(nomFichier[1])) && nomFichier[2] == L'x' ) { Creer_Episode(cheminFichier); return; }
par un code bien plus lisible :
Il faudra faire quelques aménagements dans les classes pour que ce code "fonctionne".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 if(std::regex_match(nomFichier, std::wregex{L"([[:digit:]]{1,2})x(.)+"})) { InfosVisionnage info_vis{cheminFichier}; if(m_liste_episodes.existe(info_vis.numero_episode)) { m_liste_episodes[info_vis.numero_episode].AjouterInfosVisionnage(info_vis); } else { m_liste_episodes[info_vis.numero_episode] = Creer_Episode(info_vis); } }
Le code d'affichage d'un épisode devrait être revu pour qu'il utilise correctement la liste des séquences de séances d'affichage.
Bonsoir,
Thunderbird : pas de message !!! forum@redaction-developpez.com ??? 2 fois ???
Pas de message ? comprendre pas ?Citation:
Matomo Analytics ne semble pas gratuit, juste le test est gratuit.
C'est pas juste la fin de la période de Test ?
...
Le code d'affichage d'un épisode devrait être revu pour qu'il utilise correctement la liste des séquences de séances d'affichage.
Pourquoi ???
Sinon :
https://github.com/laurentbouleau/Exemple : Avril 02
Et : (serie)
void afficher_Chaine(std::filesystem::path const& cheminFichier); et void Print_Chaine();vert !
Pourquoi ?
Et :Code:
1
2
3
4
5
6
7 class Serie { ... void afficher_Chaine(std::filesystem::path const& cheminFichier); ... void Print_Chaine(); };
Pourquoi ?Code:
1
2
3
4
5
6
7 void Serie::afficher_Fichier(fs::path const& cheminFichier) ... const void Serie::Print_Episodes(Saison saison) ... const void Serie::Print_Saison(Saison saison) ... const void Serie::Print_Saisons()
Je suis crevé !!!
Merci d'avance:aie:
C'est l'essai de la version Cloud qui est gratuite.Citation:
Pour la version "On-Premise", c'est à vous de vous démerder.
https://matomo.org/pricing/
Quelle est la question ?Citation:
Pas de message ? comprendre pas ?Citation:
Le code d'affichage d'un épisode devrait être revu pour qu'il utilise correctement la liste des séquences de séances d'affichage.
Pourquoi ???
Pour plus d'explication sur ma dernière phrase "Le code d'affichage d'un épisode ... d'affichage", c'est qu'il faut adapter la fonction d'affichage d'un épisode (qui ne fait que de l'affichage, comme le fait la fonction Print, enfin).
Votre code de la fonction "Episode::Print()" utilise très maladroitement des "flags/drapeaux" comme le champ "numero" pour avoir un affichage différemment un "l'épisode/première séquence de séances de visualisation" des autres séquences.
C'est très complexe et très très fragile (et ça marche pas avec votre implémentation "naïve").
En ajoutant la classe "SequenceVisionnage" et en ne mettant directement dans un épisode que les informations sur l'épisode, le code de "Episode:: Print()" sera beaucoup plus simple (et correcte) car les informations sur les séquences de séances de visionnage seront dans un champ dédié.
Le champ de Episode :
devra être remplacer par un :Citation:
Code:std::vector<DateRecord> dates_de_visionnage{ 0 };
Je pense qu'en reprenant le code de "Episode:: Print()" depuis le début, votre code devrait ressembler à :Code:std::vector<SequenceVisionnage> m_liste_visionnages{ 0 };
A vous de voir comment implémenter la fonction "PrintData()", mais ça sera pas très compliqué (si vous ne collez pas des "numero" à droite à gauche).Code:
1
2
3
4
5
6
7
8 void Episode::Print() { PrintData(); for (auto vis : m_liste_visionnages) { vis.Print(); } }
(Si des données de la première séquence de visionnage sont nécessaire dans cette partie de l'affichage ( PrintData ), on avisera, mais ça sera pas bien compliqué (et toujours sans ce drapeau "numero" à la c.. ).
Actuellement l'affichage est un peu foireux parce que vous ne renseignez plus correctement le champ "dates_de_visionnage" (mais il doit disparaitre de toutes façons).
En renseignant correctement le futur champ "m_liste_visionnages", tout sera plus simple.
Vous avez plutôt bien implémenté les fonctions de la classe "SequenceVisionnage". (transfert du code en particulier)
Mais suite aux informations communiquées par la suite, j'ai indiqué qu'il serait préférable d'ajouter une classe "InfosVisionnage" car un fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" contiennent à la fois des informations sur l'épisode mais aussi des informations sur une séquence de séances de visionnages.
En transférant le code d'analyse des données en entrée dans "InfosVisionnage" plutôt que dans "SequenceVisionnage", le code serait plus simple.
Tout ce qui contient à la fois des informations sur l'épisode et une séquence de séance de visionnage => dans "InfosVisionnage"
Tout ce qui contient des informations sur un épisode => dans Episode
Tout ce qui contient des informations sur une séquence de séance de visionnage => dans "SequenceVisionnage"
Avec ces modélisation, algorithme devient :
EDIT:
Code:
1
2
3
4
5
6
7
8
9
10
11
12 <Scan des fichiers d'un Saison> Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" alors Créer un "InfosVisionnage" à partir du fichier Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison alors Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison) Sinon Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages" Sinon .... <Fin Scan des fichiers d'un Saison>
Bin déjà, il y a "Print_Chaine" qui fait ce qui est indiqué par son nom et "afficher_Chaine" qui ne fait absolument pas ce qu'elle indique ! :aie:Citation:
Et : (serie)
void afficher_Chaine(std::filesystem::path const& cheminFichier); et void Print_Chaine();
vert !
Pourquoi ?
Donc "Print_Chaine", c'est "bien" et "afficher_Chaine" devrait être renommé en "Initialiser_Chaine", par exemple (en ajoutant un champ "m_chaine" à votre classe Saison).
Les mêmes bêtises que pour "afficher_Chaine/Print_Chaine", nommez correctement vos fonctions et ça sera plus claire pour vous.Citation:
Code:
1
2
3
4
5
6
7 void Serie::afficher_Fichier(fs::path const& cheminFichier) ... const void Serie::Print_Episodes(Saison saison) ... const void Serie::Print_Saison(Saison saison) ... const void Serie::Print_Saisons()
Bonjour,
Attention : Chaîne d'origine.txt
Je sais pas mais c'est oublié le titre parce choix : exemple :
void Saison::afficher_Chaine(fs::path const& cheminFichier) et void Saison::Print_Chaine()
et
void Serie::afficher_Chaine(fs::path const& cheminFichier) et const void Serie::Print_Chaine()
pas même chose :
Chaîne d'origine.txtABC1.Chaîne d'origine.txt2.ABCChaîne d'origine.txtNetflix
Simple !!!
Merci :)
Bonsoir,
https://github.com/laurentbouleau/Exemple : Avril 03 (2024/04/10)
Pas compris !!! Long textes : c'est dure !!!
Pas-à-pas !!! Merci:aie:
Après !!!Citation:
<Scan des fichiers d'un Saison>
Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt"
alors
Créer un "InfosVisionnage" à partir du fichier
Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison
alors
Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison)
Sinon
Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages"
Sinon
....
<Fin Scan des fichiers d'un Saison>
Le chat : des convulsions ! Lundi et maintenant ! Encore ! Je n'ai marre !!!
Je ne suis pas sûr de comprendre vos interrogations. :oops:Citation:
Bonjour,
Attention : Chaîne d'origine.txt
Je sais pas mais c'est oublié le titre parce choix : exemple :
void Saison::afficher_Chaine(fs::path const& cheminFichier) et void Saison: Print_Chaine()
et
void Serie::afficher_Chaine(fs::path const& cheminFichier) et const void Serie: Print_Chaine()
pas même chose :
Chaîne d'origine.txt
ABC
1.
Chaîne d'origine.txt
ABC
2.
Chaîne d'origine.txt
Netflix
Simple !!!
Merci
Si c'est "pourquoi il y a des fonctions afficher_xxx et Print_xxx" dans vos classes, c'est parce que les "afficher_xxx" ne font pas ce qu'elle indique via leur nom.
Elles ne devraient s'appeler "afficher_xxx" mais "Initialiser_xxx" ou être le constructeur de la classe.
C'est ce que vous avez commencez à faire avec la fonction "Saison::initialiser_Chaine", par exemple.
A la fin, vous ne devriez plus avoir aucune fonction de la forme "afficher_xxx".
Si vous avez des fichiers "Chaîne d'origine.txt" au niveau du répertoire de la série et des répertoires des saisons, c'est pas un problème, la classe Serie aura un champ m_chaine et la classe Saison aura aussi un champ m_chaine.
Le contenu du fichier "Chaîne d'origine.txt" au niveau du répertoire de la série sera stocké dans une instance d'objet Serie, et les contenus des fichiers "Chaîne d'origine.txt" au niveau des répertoires des saisons seront stockés dans chacune des instances d'objet Saison.
La mise en page automatique de developpez.net a "écrasé" l'indentation rendant mon propos incompréhensible :Citation:
Citation:
<Scan des fichiers d'un Saison>
Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt"
alors
Créer un "InfosVisionnage" à partir du fichier
Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison
alors
Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison)
Sinon
Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages"
Sinon
....
<Fin Scan des fichiers d'un Saison>
Les dernières modifications semblent montrer que vous avez bien compris les choses à faire :Code:
1
2
3
4
5
6
7
8
9
10
11
12 <Scan des fichiers d'un Saison> Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" alors Créer un "InfosVisionnage" à partir du fichier Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison alors Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison) Sinon Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages" Sinon .... <Fin Scan des fichiers d'un Saison>
L'ajout de la classe InfosVisionnage
Renommage de certain champs et méthodes
Mais:
Pourquoi avoir mis en commentaire/supprimer la classe Episode ?
Vous avez remplacé le champ "std::vector<Episode> episodes" de la classe Saison par "std::vector<SequenceVisionnage> sequencevisionnages", et je pense que c'est une erreur.
Une saison "contient" des épisodes et chaque épisode "est associé" à des séquences de séances de visionnage, non ?
Alors la classe Saison devrait contenir un champ "std::vector<Episode> episodes" et la classe Episode devrait contenir un champ "std::vector<SequenceVisionnage> sequencevisionnages", non ?
Une grande partie du code du constructeur de "SequenceVisionnage" devrait être transféré dans le constructeur de "InfosVisionnage" car, comme déjà indiqué, un fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" contient des informations sur la séquence de séances de visionnage mais aussi des information sur l'épisode.
Bonsoir,
Pas fini !!!
https://github.com/laurentbouleau/Exemple : Avril 04 (2024/04/12)
Le chat est malade : encore… https://www.b-lolo.fr/2024/04/12/le-...malade-encore/
Demain : Je suis crevé:aie:Code:
1
2
3
4
5
6
7
8
9
10
11
12 <Scan des fichiers d'un Saison> Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" alors Créer un "InfosVisionnage" à partir du fichier Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison alors Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison) Sinon Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages" Sinon .... <Fin Scan des fichiers d'un Saison>
Merci:(
Bonsoir,
Elfy va mieux (15 ans) !!! Ben, pas toute suite !
Alors,
https://github.com/laurentbouleau/Exemple : Avril 05 (2024/04/18)
Merci:aie:Code:
1
2
3
4
5
6
7
8
9
10
11
12 <Scan des fichiers d'un Saison> Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" alors >>> Créer un "InfosVisionnage" à partir du fichier etc... Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison alors Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison) Sinon Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages" Sinon .... <Fin Scan des fichiers d'un Saison>
Bonsoir,
Elfy est bien (15 ans) !
et / ou :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 if(std::regex_match(nomFichier, std::wregex{L"([[:digit:]]{1,2})x(.)+"})) { InfosVisionnage info_vis{cheminFichier}; if(m_liste_episodes.existe(info_vis.numero_episode)) { m_liste_episodes[info_vis.numero_episode].AjouterInfosVisionnage(info_vis); } else { m_liste_episodes[info_vis.numero_episode] = Creer_Episode(info_vis); } }
Pourquoi ?Code:
1
2
3
4
5
6
7
8
9
10
11
12 <Scan des fichiers d'un Saison> Si fichier de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" alors Créer un "InfosVisionnage" à partir du fichier Si l'Episode indiqué dans l'InfosVisionnage existe déjà dans la saison alors Mettre à jour l'Episode avec la "SequenceVisionnage" contenu dans l'InfosVisionnage (voir aussi vérifier que les informations sur l'épisode dans l'InfosVisionnage soit les mêmes que dans l'épisode trouvé dans la Saison) Sinon Créer un nouvel Episode en lui passant l'InfosVisionnage pour que l'épisode initialise ces champs, y compris son "m_liste_visionnages" Sinon .... <Fin Scan des fichiers d'un Saison>
Merci beaucoup:aie:
Les fichiers de la forme "numéroSaisonxNuméroEpisode.{listeDeDates}.txt" contiennent à la fois des informations sur un épisode et sur une séquence de séances de visionnage.
En passant par une classe dédiée pour récupérer toutes les informations puis de s'en servir pour initialiser les instances d'Episode et de SequenceVisionnage, cela permet de ne mettre dans ces 2 classes que des informations pertinentes pour ces types d'objets.
Le code est un exemple d'implémentation de l'algorithme indiqué.
A la fin, on doit avoir une organisation des objets simple :
Une série contient des saisons, une saison contient des épisodes, et un épisode contient des séquences de séances de visionnage, une séquence de séances de visionnage contient des séances de visionnage.
"m_liste_episodes" est le champ d'un objet Saison contenant la liste des épisodes de la saison.
"m_liste_visionnages" est le champ d'un objet Episode contenant la liste des séquences de séance de visionnage de l'épisode. on pourrait le nommer "m_liste_sequence_visionnage" pour être plus précis.
Bonsoir,
existe : Pourquoi ? Pas de solution !!!Code:
1
2
3
4
5
6
7
8
9 InfosVisionnage info_vis{ m_cheminFichier }; if (m_liste_episodes.existe(info_vis.m_NumeroEpisode)) { m_liste_episodes[info_vis.m_NumeroEpisode].AjouterInfosVisionnage(info_vis); } else { m_liste_episodes[info_vis.m_NumeroEpisode] = Creer_Episode(info_vis); }
Merci:aie:
Et exists :
https://en.cppreference.com/w/cpp/filesystem/exists ???
Désolé, ma réponse n'était pas si évidente.
Ce "existe", c'est une fonction "imaginaire", qui est soit à implémenter soi-même soit utiliser celle corresponde dans le type du champ "m_liste_episodes", si son type le permet.
Si le champ "m_liste_episodes" est une "std::map<int,Episode>" (https://fr.cppreference.com/w/cpp/container/map) par exemple,
L'équivalent de "existe(NumeroEpisode)" serait :
Code:m_liste_episodes.find(NumeroEpisode)!= m_liste_episodes.end()
Bonjour,
Ok ou non ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]]{1,2})x(.)+" })) { //creer_InfosVisionnage(m_cheminFichier); InfosVisionnage info_vis{ m_cheminFichier }; if (m_liste_episodes.find(info_vis.m_NumeroEpisode) != m_liste_episodes.end()) { m_liste_episodes[info_vis.m_NumeroEpisode].AjouterInfosVisionnage(info_vis); } else { m_liste_episodes[info_vis.m_NumeroEpisode] = Creer_Episode(info_vis); } //creer_SequenceVisionnage(m_cheminFichier); return; }
Merci:aie:
Oui, si le champ "m_NumeroEpisode" est un int.