Bonjour Bacelar,
J'ai oublié !!! Oui, Regex, dure à dire !!!
The Walking Dead : https://www.allocine.fr/series/fiche.../saison-37153/ : saisons 11 !!!
Comment faire ?
Et Episode::Episode(fs::path const& m_cheminFichier) ?
Merci beaucoup
Bonjour Bacelar,
J'ai oublié !!! Oui, Regex, dure à dire !!!
The Walking Dead : https://www.allocine.fr/series/fiche.../saison-37153/ : saisons 11 !!!
Comment faire ?
Et Episode::Episode(fs::path const& m_cheminFichier) ?
Merci beaucoup
Vous ne posez toujours pas de question. C'est compliqué de répondre succinctement à vos interrogations si vous ne les exprimez pas.
On va encore jouer au jeu des 7 différences pour voir ce qui "cloche" selon vous.
Si on reprend les 2 premières images de votre post ici, celui avec "Moi" affiche avant le titre de l'épisode le numéro de la saison "x" le numéro de l'épisode dans la saison.
C'est donc une différence dans l'affichage du titre de l'épisode. On est OK sur le "problème" que vous voulez "corriger" ?
Comme votre code commence à utiliser des noms qui ont du sens, on peut aller directement au code qui semble poser problème : la fonction "Episode:: Print()"
Dans cette fonction :
On voit que l'affichage des données qui semblent manquer dans l'image "Vous" est lié à la valeur de "chiffre_et_point_ou_pas".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 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; }
C'est le résultat de l'appel à la fonction "Episode:: Print_Titre_chiffre_et_point_ou_pas" qui se résume à :
Donc l'absence dans l'affichage vient du fait que le champ "episode" est égale à 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 bool Episode::Print_Titre_chiffre_et_point_ou_pas(unsigned char episode) { if (episode == 0) return false; return true; }
Il y a donc un problème dans le constructeur de "Episode" qui n'initialise pas correctement ce champ "episode".
Constatation vérifiée en utilisant le débugueur qui permet de valider ces hypothèses.
Le constructeur est la fonction "Episode:: Episode(fs::path const& m_cheminFichier)".
Supprimez-moi ce putain de "m_" du nom de l'argument de la fonction, "m_" c'est pour indiquer un membre (généralement un champ) d'une classe, ici ce n'est pas (encore) un membre de la classe mais juste un paramètre de la fonction.
Le champ "std::filesystem::path m_cheminFichier;" que vous avez spécifié dans le .h n'est jamais initialisé.
Et avec votre nom de paramètre (à la con), cela donnerait comme code d'initialisation du champ m_cheminFichier dans le constructeur ; un code de la forme :
C'est clairement illisible et on utilise un hack (mettre "this." devant) pour que le code fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.m_cheminFichier = m_cheminFichier;
Alors que si le paramètre se nommerait "cheminFichier" (comme dans sa déclaration dans le .h), le code d'initialisation du champ serait :
Quand même bien moins casse-gueule, non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part m_cheminFichier = cheminFichier;
Le numéro de l'épisode est dans le nom du fichier dont le chemin est passé en paramètre du constructeur (que je nommerai par la suite "cheminFichier" et pas "m_cheminFichier", parce que "m_cheminFichier" c'est un nom bien trop merdique).
Quand cheminFichier est égale à "./House of Ninjas.[2024 Netflix].Mini-série\2024-02-15\1x1.2024-02-17.txt", le numéro de l'épisode est la partie coloriée en rouge.
Si vous regardez un peu plus attentivement comment fonctionne l'expression régulière, vous verrez que cette partie du chemin est dans la variable "match[filename_numero_episode_index]".
Variable qui est utilisé à a ligne 510 de "serie.cpp" pour initialiser la variable poétiquement nommée "fucking_e", en l'honneur de vos noms de variables si mal choisies.
Comme vous ne vous servez plus de fucking_e, vous devriez utiliser, à la place, un code de la forme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part fucking_e = std::stoi(match[filename_numero_episode_index]);
Il faudrait juste changer le type de champ "episode" pour qu'il soit logiquement un nombre et pas un "unsigned char".episode = std::stoi(match[filename_numero_episode_index]);
Je ne comprends pas la logique de faire du champ "episode" un "unsigned char", ça va être bien le bordel quand il y aura plus de 9 épisodes par saisons.
Mais il semble que le code qui sert à initialiser le champ "episode" n'utilise pas le nom du fichier mais son contenu. (pourquoi faire simple ?)
Ligne 522 à 531 de éserie.cpp" :
Donc, si la première ligne du fichier ne respecte pas le format attendu, on met '0' dans le champ "episode". (Ça sert à rien car c'est déjà la valeur par défaut).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 pos = t[0].find(L". "); if (pos == std::wstring::npos || t[0][3] == L'.') { //saison = 0; episode = 0; } else { unsigned int x = std::stoi(t[0], &pos); t[0] = t[0].substr(pos + 2); }
Mais si ma première ligne du fichier respect le format attendu, on met dans la variable locale "x", la valeur du numéro de l'épisode.
On met ce numéro d'épisode qui est dans la variable locale "x" dans le champ "episode" de l'objet à quel moment ? (bin, jamais)
En remplaçant la ligne 530 par :
et en changeant le type du champ episode pour que cela compile, vous aurez votre champ "episode" correctement initialisé et donc un affichage "correct".
Code : Sélectionner tout - Visualiser dans une fenêtre à part episode = std::stoi(t[0])
Vous avez pris la bonne initiative d'ajouter au constructeur le code qui initialise les données de l'objet Episode à partir du contenu du fichier.
Mais vous continuez d'utiliser ces usines à gaz à base de find, pos et autres booléen foundx.
Je pense que le format du contenu du fichier n'est pas très complexe et qu'une expression régulière d'une forme proche de :
"(([[:digit:]]+)\\.\\s)?(.+)((\\s?(\\-|\\\\s|/)(.+))?"
Devrait permettre de récupérer le titre et le sous-titre bien plus facilement et de manière bien plus fiable.
(Il y a peut-être à gérer l'aspect "non greedy" du titre à corriger)
Et le code de la fonction "afficher_Temps", qui est appelé par le constructeur est aussi une usine à gaz simplifiable avec quelques expressions régulière, et c'est encore un putain de nom de fonction qui n'a rien à voir avec ce qu'elle fait réellement.
On est d'accord, il y a problème, mais c'est dans le code que vous avez ajouté (=> usine à gaz).D'accord : Problème !!!
C'est à dire ?Moyennement !!!
Les expressions régulières, c'est un gros morceau, si vous ne comprenez pas tout, c'est tout à fait normal.
Je ne comprends pas vos références aux pages d'Allociné.
Quelle est la question ?The Walking Dead : https://www.allocine.fr/series/fiche.../saison-37153/ : saisons 11 !!!
Comment faire quoi ?Comment faire ?
Et Episode::Episode(fs::path const& m_cheminFichier) ?
J'ai déjà montré ci-dessus que le code ajouté (usine à gaz) est bogué.
Bonjour bacelar,
Pourquoi :
".webp" : ok !
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
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 void Saison::afficher_Fichier(fs::path const& cheminFichier) { auto nomFichier = cheminFichier.filename().wstring(); std::wcout << nomFichier << std::endl; auto nomImage = cheminFichier.extension().wstring(); std::wcout << L'{' << nomImage << L'}' << std::endl; if (nomImage == L".jgp") { std::wcout << nomFichier << std::endl; ::afficher_Image(cheminFichier, image); return; } if (nomImage == L".txt") { if (nomFichier == L"_you_.txt") { return; } if (!(std::isdigit(nomFichier[0]))) { // Avec if (nomFichier == L"Avec.txt") { ::afficher_Avec(cheminFichier, avec); return; } // Chaîne d'origine - if (nomFichier == L"Chaîne d'origine.txt") { //afficher_Chaine(filename, nomFichier, d_chaine[I]); return; } // DVD if (nomFichier == L"DVD.txt") { //D_DVD[I] = true; return; } // Netflix if (nomFichier == L"Netflix.txt") { afficher_Netflix(cheminFichier); return; } // Note if (nomFichier == L"Note.txt") { afficher_Note(cheminFichier); return; } // Titre if (nomFichier == L"Titre.txt") { afficher_Titre(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') && 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; } if (int j = std::stoi(nomFichier)) { afficher(cheminFichier); return; } // Erreur ! if (nomFichier != L"") { //E.afficher_X(-1, nomFichier, L'{' + t + L".txt} !!!"); return;// EXIT_FAILURE; } } else if (nomImage == L".jgp") // Image { std::wcout << nomFichier << std::endl; afficher_Image(cheminFichier, image); return; } else if(nomImage == L".jgp" || nomImage == L".png" || nomImage == L".webp") // Image { std::wcout << nomFichier << std::endl; afficher_Image(cheminFichier, image); return; } else { } return; }
mais : ".jgp" ?
La question ?
Merci beaucoup
Le code que vous postez ne correspond pas à celui dans Github (la 2ème version "Mars 04", faites en sorte que vos tags Github soient unique BORDEL).
Mais bon, il y a plus de connerie dans celui que vous postez que dans celui du dépôt Github.
Donc on passe sur ces putain de "std::wcout << ..." à la con, que je vous indique de ne pas utiliser depuis des mois et d'utiliser le débogueur interactif à la place.
Ils ne sont pas dans la version Github, et tant mieux.
Vous testez pas moins de 3 fois la valeur de "nomImage" (encore un nom à la con, préférez "extImage" car ce n'est que l'extension du fichier qui est contenu dans cette variable) à la valeur ".jgp".
Et les 3 fois avec une faute "d'orthographe".
L'extension du fichier attendue, c'est pas ".jgp", mais ".jpg".
Le code dans Github n'a qu'une fois l'erreur.
Donc prenez la version sous Github et changer ".jgp" par ".jpg". (et je vous ai pas dit de ne pas utiliser des valeurs en dur dans le code, pour ne pas à regarder partout dans le code quand on fait une erreur de typo à la con que celle-ci ?)
Je suis vraiment désolé (".jgp" par ".jpg") ! Mais, bon
https://github.com/laurentbouleau/Exemple : Mars 05
Les problèmes :
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 struct Episode { ... unsigned short int saison{}; unsigned short int episode{}; std::vector<DateRecord> dr; std::wstring streaming; bool b { false }; std::wstring titre; std::wstring deux_points; std::wstring sous_titre; std::tm tm{ 0 }; std::wstring phrases; ... };Pas compris !!!
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
18
19
20
21
22
23
24 Episode::Episode(fs::path const& cheminFichier) { ... std::vector<DateRecord> drS; std::wstring streaming = L""; ... 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} }; drS.emplace_back(dr); } ... }
Aussi problème !!!
dr.size() == 1 ???
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
18
19
20
21
22
23 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dr) { if (affichage_Date_ou_dates && dr.size() > 0) // std::tm date{ 0 }; // bool someFlag{ false }; { wchar_t date_string[15]; std::wstring wstr = L""; if (dr.size() == 1) { wcsftime(date_string, 15, L"%d/%m/%Y", &dr[0].date); wstr = date_string; wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4); if (streaming != L"") wstr += keyColor[1] + L" : " + valuesColor + streaming; if (dr[0].someFlag) wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor; return wstr; } } return L""; }
Merci beaucoup
Le nommage, bordel.Pas compris !!!
Votre champ "dr", c'est pour "DateRecord", je suppose ; mais c'est un "std::vector<DateRecord>", pas un simple "DateRecord".
Donc faut au moins que ça se voit dans le nom du champ que ce n'est pas un simple "DateRecord" mais plusieurs.
Donc j'ai créé une variable locale qui fait le minimum du minimum pour montrer qu'il y a plusieurs DateRecord, en l'appelant "drS".
C'est vraiment un minimum, distinguer les variables mono-valuées des variables multi-valuées.
Mais ça serait mieux de les nommer en fonction de leurs usages/utilitées plutôt qu'un truc qui correspond à un type "générique".
Par example, "dates_de_diffusion" c'est plus clair que "drS" et encore plus que "dr".
Donc FAITES GAFFE A VOS PUTAINS DE NOMS !!!
Donc remplacer l'utilisation de la variable locale par un champ, mais avec un nom "correct".
Si j'avais utilisé votre "dr", le code aurait été illisible.
C'est la manière habituelle de créer un objet/structure avec les champs initialisés, car vous n'avez pas pris la peine de définir un constructeur de "DateRecord".
Code : Sélectionner tout - Visualiser dans une fenêtre à part DateRecord dr{ {0,0,0,day,month - 1,year - 1900} };
Toujours initialiser correctement un objet dès sa création.
https://medium.com/pranayaggarwal25/...ns-c11e931c3ba
Donc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 struct DateRecord { std::tm date{ 0 }; bool someFlag{ false }; };
sert à initialiser les champs {tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year} du champ "date" de la structure "dr" de type "DateRecord.
Code : Sélectionner tout - Visualiser dans une fenêtre à part {0,0,0,day,month - 1,year - 1900}
cf.:https://en.cppreference.com/w/cpp/chrono/c/tm
Pourquoi ces "-1" et autres "-1900" qui se baladent : regardez dans la documentation le format des champs comme tm_year : years since 1900 (nombres d'années depuis 1900), oui c'est un format bien pourri ou "0" ça veut dire "1900".
Bin ça, c'est votre code, je sais pas pourquoi vous le fait comme ça et que vous truffez votre code de "dr[0]" complètement foireux.dr.size() == 1 ???
Reprenez le code de votre fonction pour qu'il gère que l'argument "std::vector<DateRecord>& dr" soit multi-valuées.
Tient-tient on reboucle sur le fait de mal nommer les arguments, ça fait du code "débile" dans la fonction.
Vous connaissez la chanson maintenant "NOMMEZ CORRECTEMENT VOS VARIABLES/CHAMPS/ARGUMENTS, BORDEL !!!".
Et bien jouer pour la copie d'écran qui montre que vous commencez à vous servir du débugueur.
Bonsoir,
Je ne sais plus le faire ! J'ai du mal a lire et écrire !
Mais, bon : tant pis !
https://github.com/laurentbouleau/Exemple : Mars 06
Erreur :
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
18
19
20
21
22
23
24
25 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0) // std::tm date{ 0 }; // bool someFlag{ false }; { std::wstring wstr = L""; if (dates_de_diffusion.size() == 1) { std::time_t t = std::mktime(&dates_de_diffusion[0].date); std::tm local = *std::localtime(&t); std::wcout << "local: " << std::put_time(&local, L"%d/%m/%Y") << '\n'; //wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4); // Ici : wstr = std::put_time(&local, L"%d/%m/%Y"); if (streaming != L"") wstr += keyColor[1] + L" : " + valuesColor + streaming; if (dates_de_diffusion[0].someFlag) wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor; return wstr; } } ...
Je suis crevé ! Je m'arrive pas ! J'en ai marre !!!
Merci
Bonsoir,
https://github.com/laurentbouleau/Exemple : Mars 07
Problème ou pas ?
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
18
19
20
21
22
23
24
25
26
27
28 void Episode::afficher_temps_min(std::wstring& m) { assert(m.length() > 0 && L"Nom de temps min et vide"); int temps = 0; std::size_t pos = 0; temps = std::stoi(m, &pos); assert((temps != 0 ) && L"Pas de temps !!!"); if(temps < 60) tm.tm_min = temps; else { tm.tm_hour = temps / 60; tm.tm_min = temps % 60; } m = m.substr(pos); assert(!(m[0] != L' ' && m[0] != L'm' && m[0] != L'M') && L"Pas d'escapace ou min, Min ou MIN !!!"); if (m[0] == L' ') m = m.substr(1); if (std::find(::min.begin(), ::min.end(), m) != ::min.end()) ; else { assert((m[1] == L' ') && "Attention min non valide ou non incompris !!!"); } return; }
Presque !!!
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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 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(tm.tm_hour == 0) wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(tm.tm_min) + keyColor[1]+ min + L')' + valuesColor; else { int temps = tm.tm_hour * 60 + tm.tm_min % 60; wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(temps) + keyColor[1] + min + L')' + valuesColor; } wstr += keyColor[1] + L" : " + valuesColor + Print_Date_ou_Dates(dates_de_diffusion); std::wcout << wstr << std::endl; // phrases if (titre != L"") std::wcout << phrases << std::endl; else ; } }
Hier, pas compris !!!
https://en.cppreference.com/w/cpp/chrono
et
https://en.cppreference.com/w/cpp/chrono/c/tm
etc... ben non !!! Alors...
Ici : wstr ??? std::put_time(&local, L"%d/%m/%Y");
Compliqué à dire !!!
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
18
19
20
21
22
23
24
25 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0) // std::tm date{ 0 }; // bool someFlag{ false }; { std::wstring wstr = L""; if (dates_de_diffusion.size() > 0) { // std::time_t t = std::mktime(&dates_de_diffusion[0].date); // std::tm local = *std::localtime(&t); // std::wcout << "local: " << std::put_time(&local, L"%d/%m/%Y") << '\n'; //wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4); // Ici : //wstr = std::put_time(&local, L"%d/%m/%Y"); if (streaming != L"") wstr += keyColor[1] + L" : " + valuesColor + streaming; if (dates_de_diffusion[0].someFlag) wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor; return wstr; } } ...
Merci d'avance
"std::put_time", c'est un peu mal foutu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ... #include <sstream> ... std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { .... std::wstringstream target_stream; target_stream << std::put_time(&local, L"%d/%m/%Y"); wstr = target_stream.str(); ... } ...
Je veux mon neveu qu'il y a pas mal de problème.
Déjà, le nommage, c'est n'importe quoi comme d'habitude.
"Episode::afficher_temps_min" fait tellement pas ce qu'indique son nom que j'ai utilisé la fonctionnalité de Visual Studio pour la renommé "Episode::afficher_temps_min_monCul".
Elle fait plein de choses différentes mais clairement pas "afficher" un temps en "min(nute)".
Ce code montre aussi une grosse erreur qu'il faut rapidement corriger, l'utilisation d'un mauvais type de données.
C'est le genre d'erreur à supprimer instantanément.
Ici, vous utilisez un champ "tm" (encore un nom A LA CON!!!) de type "std::tm" pour stocker une durée.
https://en.cppreference.com/w/cpp/chrono/c/tm
C'est fait pour stocker une DATE pas une durée.
C'est tellement pas une durée que le code que fourni ChatGPT à la question :
"Comment remplir un std::tm à partir d'un nombre de minute ?"
Est :
Je vous laisse apprécier la bonne grosse boulette "time.tm_year += 1900;" à la place de "time.tm_year -= 1900;".
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
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 #include <iostream> #include <ctime> // Remplit un objet std::tm à partir d'un nombre de minutes std::tm fill_tm_from_minutes(long long minutes) { std::tm time = {}; // Initialise avec les valeurs par défaut long long remaining_minutes = minutes; // Calcul des années time.tm_year = static_cast<int>(remaining_minutes / (60 * 24 * 365)); remaining_minutes %= (60 * 24 * 365); // Calcul des jours dans l'année time.tm_yday = static_cast<int>(remaining_minutes / (60 * 24)); remaining_minutes %= (60 * 24); // Calcul des heures time.tm_hour = static_cast<int>(remaining_minutes / 60); remaining_minutes %= 60; // Minutes restantes time.tm_min = static_cast<int>(remaining_minutes); // Conversion de l'année en années depuis 1900 time.tm_year += 1900; // Conversion du jour de l'année en mois et jour du mois int month = 0; while (time.tm_yday >= 0) { int days_in_month = 0; switch (month) { case 0: case 2: case 4: case 6: case 7: case 9: case 11: days_in_month = 31; break; case 3: case 5: case 8: case 10: days_in_month = 30; break; case 1: if ((time.tm_year % 4 == 0 && time.tm_year % 100 != 0) || time.tm_year % 400 == 0) days_in_month = 29; // Leap year else days_in_month = 28; break; } if (time.tm_yday >= days_in_month) { time.tm_yday -= days_in_month; month++; } else { break; } } time.tm_mon = month; time.tm_mday = time.tm_yday + 1; return time; } int main() { long long minutes = 123456789; // Exemple de nombre de minutes // Remplir un objet std::tm à partir du nombre de minutes std::tm time = fill_tm_from_minutes(minutes); // Afficher le résultat std::cout << "Year: " << time.tm_year << std::endl; std::cout << "Month: " << time.tm_mon << std::endl; std::cout << "Day: " << time.tm_mday << std::endl; std::cout << "Hour: " << time.tm_hour << std::endl; std::cout << "Minute: " << time.tm_min << std::endl; return 0; }
Mais on voit que std::tm c'est n'importe quoi, parce qu'on se fout des années bisextiles ou des passages des heures d'été et d'hiver pour une durée.
Dans un premier temps, on peut stocker la durée sous forme d'un simple entier pour indiquer le nombre de secondes (si on fait l'assertion que la résolution de la durée est à la seconde).
Dans l'audio-visuelle "sérieuse", on a plutôt tendance à utilisé des "frames" et pas des secondes.
Donc à la place de cette cochonnerie dans serie.h
Utilisez plutôt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::tm tm{ 0 };
Après, dans le corps de la fonction elle-même, vous confondez toujours l'usage d'"assert" et le lancement d'une exception.
Code : Sélectionner tout - Visualiser dans une fenêtre à part long duree_en_seconde{ -1 };
Les asserts se déclenchent quand le contenu d'une fichier (l'argument de la fonction est le contenu d'une ligne dans un fichier), et non lors de la détection d'une erreur de programmation.
Ce n'est donc pas des asserts qu'il faut utiliser mais lancer une exception avec un type et des informations qui permettrait aux codes appelants de corriger le tir.
Le code est encore une usine à gaz qu'une simple expression régulière rendrait plus lisible :
Et vous pourrez renommer "Episode::afficher_temps_min_monCul" en "Episode::initialiser_duree" par exemple.
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 void Episode::afficher_temps_min_monCul(std::wstring& m) { const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)" }; std::wsmatch match; if (std::regex_match(m, match, duree_format_rg)) { auto duree_en_minute = std::stoi(match[1]); duree_en_seconde = duree_en_minute * 60; } else { throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide."); } }
Comme déjà indiqué std::tm est un type de données qui n'a rien à faire avec des durées.
Déjà répondu avant mais std::tm est un type inapproprié à l'usage que vous voulez en faire.
Quelle est la question ?
Bonjour,
Moi : Alzheimer : Oui ou non ?
Et :
Tu parles !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part Episode::afficher_temps_min_monCul
Merci d'avance
Et vous pourrez renommer "Episode::afficher_temps_min_monCul" en "Episode::initialiser_duree" par exemple.
(BIS)
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 void Episode::initialiser_duree(std::wstring& m) { const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)" }; std::wsmatch match; if (std::regex_match(m, match, duree_format_rg)) { auto duree_en_minute = std::stoi(match[1]); duree_en_seconde = duree_en_minute * 60; } else { throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide."); } }
Un problème particulier, ou vous en avez marre de mes réponses "désobligeantes" ?
Bonsoir,
Je suis désolé ! Mais, monCul : j'aime pas !!!
Ok ? Merci
Voici :
https://github.com/laurentbouleau/Exemple : Mars 08
Problème : pas si ni :
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
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 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0) // std::tm date{ 0 }; // bool someFlag{ false }; { std::wstring date_ou_dates_wstr = L""; if (dates_de_diffusion.size() > 0) { std::vector<std::wstring> v_wstr; for (auto i = 0; i < dates_de_diffusion.size(); i++) { std::time_t t = std::mktime(&dates_de_diffusion[i].date); std::tm local = *std::localtime(&t); std::wstringstream target_stream; target_stream << std::put_time(&local, L"%d/%m/%Y"); std::wstring date = target_stream.str(); //date = date.substr(0, 2) + L'/' + date.substr(3, 2) + L'/' + date.substr(6, 4); //date = date.substr(0, 2) + keyColor[1] + L'/' + valuesColor + date.substr(3, 2) + keyColor[1] + L'/' + valuesColor + date.substr(6, 4); v_wstr.push_back(date); date = L""; target_stream.str() = L""; } if (v_wstr.size() == 1) { date_ou_dates_wstr = v_wstr[0].substr(0, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(3, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(6, 4); if(dates_de_diffusion[0].someFlag) date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor; if (streaming != L"") date_ou_dates_wstr += keyColor[1] + L" : " + valuesColor + streaming; return date_ou_dates_wstr; } //system("PAUSE"); std::wstring date2 = v_wstr[0]; int j = 1; for (size_t i = 0; i < v_wstr.size(); i++) { if (i > 0 && date2 == v_wstr[i]) { if (v_wstr[i - 1] == v_wstr[i]) { v_wstr[i - 1] += L"(1)"; v_wstr[i] = L"(2)"; j += 2; } else { v_wstr[i] = L'(' + std::to_wstring(j) + L')'; j++; } } else { j = 1; date2 = v_wstr[i]; } } bool first = true; for (auto i = 0; i < v_wstr.size(); i++) //for (auto& v : v_wstr) { if (!first && v_wstr[i][0] != L'(') date_ou_dates_wstr += L", "; date_ou_dates_wstr += v_wstr[i]; first = false; } //bool last = false; if (dates_de_diffusion.back().someFlag) { std::wcout << L"aaaa"; date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel" + keyColor[1] + L')' + valuesColor; } size_t pos; if (pos = date_ou_dates_wstr.find(L" et ")) date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L" et ", keyColor[1] + L" et " + valuesColor); if (pos = date_ou_dates_wstr.find(L")(")) date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L")(", keyColor[1] + L")(" + valuesColor); if (pos = date_ou_dates_wstr.find(L"(")) date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L"(", keyColor[1] + L"(" + valuesColor); if (pos = date_ou_dates_wstr.find(L")")) date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L")", keyColor[1] + L")" + valuesColor); if (pos = date_ou_dates_wstr.find(L", ")) date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L", ", keyColor[1] + L", " + valuesColor); date_ou_dates_wstr += L' ' + keyColor[1] + L'[' + valuesColor + L"pas-à-pas" + keyColor[1] + L']' + valuesColor; if (streaming != L"") date_ou_dates_wstr += keyColor[1] + L" : " + valuesColor + streaming; return date_ou_dates_wstr; } } return L""; }Pas compris !
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wstring streaming = L"";
Et :
Erreur ou pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { ... if(dates_de_diffusion[0].someFlag) date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor; ... if (dates_de_diffusion.back().someFlag) { date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel" + keyColor[1] + L')' + valuesColor; } ... return L""; }
Ok :
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 struct Episode { ... bool fichier_zero { false }; ... };
Pas terminé !!!
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
18
19
20
21
22
23
24
25
26
27 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; wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde/60) + keyColor[1] + min + L')' + valuesColor; wstr += keyColor[1] + L" : " + valuesColor + Print_Date_ou_Dates(dates_de_diffusion); std::wcout << wstr << std::endl; // phrases if (titre != L"") std::wcout << phrases << std::endl; else ; } }
En suite :
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <iostream> #include <ctime> // Remplit un objet std::tm à partir d'un nombre de minutes std::tm fill_tm_from_minutes(long long minutes) { std::tm time = {}; // Initialise avec les valeurs par défaut long long remaining_minutes = minutes; ...
Pas compris !Je vous laisse apprécier la bonne grosse boulette "time.tm_year += 1900;" à la place de "time.tm_year -= 1900;".
Pas-à-pas et compliqué !
Moi, simple !
Merci beaucoup
Et :
Avertissement C4244 '=' : conversion de 'wchar_t' en 'char', perte possible de données Exemple C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\xutility 4537std::invalid_argument : ok !
Code : Sélectionner tout - Visualiser dans une fenêtre à part throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide.");
Mais
Marche pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part throw std::invalid_argument(L"'" + std::wstring{ m.begin(),m.end() } + L"' n'est pas un format de durée valide.");
Voilà !
Bonjour,
https://github.com/laurentbouleau/Exemple : Mars 09
Expressément :
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 struct Episode { ... std::wstring streaming{ L"" }; ... };
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Episode::Episode(fs::path const& cheminFichier) { ... //std::wstring streaming = L""; ...
Exemple :
Plus rapide ou pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 pos = t[0].find(L" - "); if (pos != std::wstring::npos && !found2) { titre = t[0].substr(0, pos); deux_points = L" : "; sous_titre = t[0].substr(pos + 3); found2 = true; }
Merci
Bonjour,
Sans vouloir vous offenser, mais je remet en doute vos capacités cognitive à mener ce projet à bien.
Après avoir regardé votre dépôt GitHub, je me demande s'il ne serait pas pertinent de revoir votre conception, et repartir sur des bases saines.
Les affichages (entre autre) n'ont rien à faire dans vos classes métier (s'afficher n'est simplement pas leurs job).
Vous voulez gérer un catalogue de séries.
Sachant qu'une série contient des saisons,
et qu'une saison contient des épisodes.
Je vous suggère de commencer par la classe Episode (la plus profonde dans la hiérarchie),
écrire son constructeur, ses accesseurs.
Ensuite, écrire des fonctions pour tester la classe dans tous les sens.
Une fois tous les tests validés, on passe à la classe supérieur.
J'étais exaspéré par votre manque de réaction au fait que vous ne nommiez pas correctement vos fonctions/variable, etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2Je suis désolé ! Mais, monCul : j'aime pas !!! Ok ? Merci
Le développement est bien assez difficile pour ne pas se mettre des bâtons dans les roues et nommant n'importe comment les choses.
Vous n'aimez pas "monCul", très bien, alors n'aimez pas nommer n'importe comment vos fonctions/variable, etc..., SVP.
Vous avez commencé à changer les noms des fonctions, c'est très bien, MERCI !!!
GARDEZ CETTE HABITIDE.
Quelle est la question ? SVP !!!Problème : pas si ni :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) {...}
Ce que je peux dire, c'est que la fonction "Episode:rint_Date_ou_Dates" est horriblement complexe, et je pense pour pas grand-chose.
La variable "affichage_Date_ou_dates", ok, mais ce n'est pas à la fonction qui "affiche les dates" de vérifier cela, c'est un raisonnement de plus haut niveau que l'affichage ou pas des dates, donc on dégage.
"dates_de_diffusion.size() > 0" fait plein de fois à plein d'endroit, pour un effet nul, donc on dégage.
Ces lignes sont liées, si vous changez l'une vous cassez l'autre. On ne fait pas ce genre de chose avec des lignes séparées par plusieurs lignes. Sinon, c'est inmaintenable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 target_stream << std::put_time(&local, L"%d/%m/%Y"); ... date_ou_dates_wstr = v_wstr[0].substr(0, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(3, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(6, 4);
Vous faites plusieurs boucles sur des structures équivalentes (dates_de_diffusion et v_wstr), au lieu de tout faire dans une seule boucle ?
Pourquoi ???
Ca rend le code dur à comprendre.
Faire une seule boucle, c'est bien plus simple.
Pourquoi distinguer ce cas, et si c'est pertinent, pourquoi les différences sont si peu "explicites" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (v_wstr.size() == 1)
Un "return" en plein milieu d'une fonction, c'est rarement une bonne pratique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part return date_ou_dates_wstr;
Vous séparez la génération du texte de la génération de la mise en page (fixation des couleurs, etc...), ça peut être bien sur le papier m'ais votre manière de faire est complexe et peu fiable. FAITES SIMPLE !!!
C'est quoi ces machins ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 date = L""; target_stream.str() = L"";
Le C++ gère la durée de vie des variables, c'est pas à vous de le faire (mal).
C'est quoi cette cochonnerie !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wcout << L"aaaa";
Version simplifiée/maintenable de "Episode:: Print_Date_ou_Dates" :
Code utilitaire à mettre dans un .h qui va bien (en attendant de mettre votre code compatible C++20 et d'utiliser "std::format" à la place):
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
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 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { const std::wstring date_format = L"%d" + keyColor[1] + L"/" + valuesColor + L"%m" + keyColor[1] + L"/" + valuesColor + L"%Y"; const std::wstring between_parenthesis = keyColor[1] + L"(" + valuesColor + L"%s" + keyColor[1] + L")" + valuesColor; const std::wstring same_date_format = between_parenthesis; const std::wstring prequel_format = between_parenthesis; const std::wstring streaming_format = keyColor[1] + L" : " + valuesColor + L"%s"; const std::wstring step_by_step_tag = L' ' + keyColor[1] + L'[' + valuesColor + L"pas-à-pas" + keyColor[1] + L']' + valuesColor; std::wstring date_ou_dates_wstr = L""; std::vector<std::wstring> v_wstr; std::time_t last_date{ 0 }; int same_date_counter = 0; for (auto dr : dates_de_diffusion) { std::time_t time = std::mktime(&dr.date); if (last_date != time) { std::tm localtime = *std::localtime(&time); std::wstringstream target_stream; target_stream << std::put_time(&localtime, date_format.c_str()); std::wstring date_str = target_stream.str(); v_wstr.push_back(date_str); same_date_counter = 0; } else { same_date_counter++; if (same_date_counter == 1) { v_wstr.back() += wstring_format(same_date_format, L"1"); } v_wstr.back() += wstring_format(same_date_format, std::to_wstring(same_date_counter + 1).c_str()); } last_date = time; } for (auto i = 0; i < v_wstr.size(); i++) { if (i != 0) date_ou_dates_wstr += L", "; date_ou_dates_wstr += v_wstr[i]; } if (dates_de_diffusion.size() == 1) { if (dates_de_diffusion[0].someFlag) date_ou_dates_wstr += wstring_format(prequel_format, L"préquel ou pas !"); } else { if (dates_de_diffusion.size() > 0) { if (dates_de_diffusion.back().someFlag) { date_ou_dates_wstr += wstring_format(prequel_format, L"préquel"); } date_ou_dates_wstr += step_by_step_tag; } } if (streaming != L"" && date_ou_dates_wstr.length() > 0) date_ou_dates_wstr += wstring_format(streaming_format, streaming.c_str()); return date_ou_dates_wstr; }
Ne trouvez-vous pas "mon" code de "Episode:: Print_Date_ou_Dates" plus clair et plus simple ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 template<typename ... Args> std::wstring wstring_format(const std::wstring& format, Args ... args) { int size_s = _snwprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0' if (size_s <= 0) { throw std::runtime_error("Error during formatting."); } auto size = static_cast<size_t>(size_s); std::unique_ptr<wchar_t[]> buf(new wchar_t[size]); _snwprintf(buf.get(), size, format.c_str(), args ...); return std::wstring(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside }
De quelle ligne parlez-vous ?Pas compris !
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wstring streaming = L"";
Elles sont toutes en commentaires sauf celle qui déclare le champ streaming dans la classe épisode, et encore, elle est un peu différente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wstring streaming{ L"" };Voir "mon" code simplifié, ne noyez pas le sens du code dans des détails comme "keyColor" ou "valuesColor".Erreur ou pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion) { ... if(dates_de_diffusion[0].someFlag) date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor; ... if (dates_de_diffusion.back().someFlag) { date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel" + keyColor[1] + L')' + valuesColor; } ... return L""; }
Donc erreur car inutilement complexe, et difficile à changer.
Pourquoi Faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 struct Episode { ... bool fichier_zero { false }; ... };
Moins de code, moins de bugs.
Beaucoup trop complexe et peu lisible pour que cela fait vraiment.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void Episode::Print() { ... }
En utilisant la même approche que dans "mon" "Episode:: Print_Date_ou_Dates" refactoré (pas de variables et tests inutiles, ne pas cacher le sens du code avec des formules à ralonge, etc...), "Episode:: Print" : c'est 3 déclarations de chaines constantes, 2 if et 3 appels à "wstring_format", rien d'autres et ça serait bien plus clair.
Comme déjà indiqué, std::tm, c'est pour une date+heure dans la journée, pas pour une durée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 // Remplit un objet std::tm à partir d'un nombre de minutes std::tm fill_tm_from_minutes(long long minutes)
Donc "fill_tm_from_minutes" n'a aucun putain de sens.
Dans le champ "tm_year" d'un "std::tm", on ne met pas l'année de la date mais l'année décalée de 1900 en moins, pour que la date de "01/01/1900" ai une valeur dans son champ "tm_year" de 0, pas 1900.Pas compris !Je vous laisse apprécier la bonne grosse boulette "time.tm_year += 1900;" à la place de "time.tm_year -= 1900;".
Le code généré par l"IA a fait l'opération inverse de celle à faire, il faut soustraire 1900 à la date pour remplir le champ "tm_year" et pas la soustraire.
Mais bon, tout ça parce qu'vous voulez utiliser un vieux machin qu'est "std:tm" qui est tout pourri.
message du "20/03/2024, 23h10":
C'est parce que la gestion des erreurs "standards" n'utilise pas de chaine de caractères unicode. Laissez le warning. On verra après comment adapter la gestion standard des erreurs avec des caractères unicode. Avec la situation actuelle, au pire, vous aurez des messages d'erreurs avec des accents mal encodés.
message du "21/03/2024, 12h18":
Oui supprimez la variable locale pour utiliser le champ à la place, pour que la valeur initialisée (dans le constructeur de la classe Episode) soit visible de toutes les fonctions d'instance de l'objet "Episode".
message du "21/03/2024, 14h00":
Plus rapide que quoi ?Plus rapide ou pas ?
Et la vitesse, on s'en cogne.
Faites du code lisible et sur !!!
Exempls :
Avec cela, on peut changer facilement de séparateur, gérer facilement l'absence d'espace, les espaces en trop, etc... pour un code plus lisible (quand on connait les expressions régulières) et plus évolutif (sections optionnels, sections récursives, etc...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 const std::wregex soustitre_format_rg{ L"(.+) \\- (.+)" }; std::wsmatch soustitre_match; if (std::regex_match(texte_a_analyser, soustitre_match, soustitre_format_rg)) { std::wstring titre = soustitre_match[1]; std::wstring sous_titre = soustitre_match[2]; }
@deedolith, je trouve qu'il a progressé et la séparation de la logique et de l'affichage pourra facilement se faire après et pour son type de projet, je ne crois pas que cela soit très judicieux.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager