Rrr !
https://github.com/laurentbouleau/Exemple : Juillet 19 (18/07/2024)
===> std::tm tm{ -1, -1, -1, -1, -1, -1, -1, -1, -1 };
Voilà !
Rrr !
https://github.com/laurentbouleau/Exemple : Juillet 19 (18/07/2024)
===> std::tm tm{ -1, -1, -1, -1, -1, -1, -1, -1, -1 };
Voilà !
Bonjour,
J'ai beaucoup de mal à lire, donc j'utilise le narrateur de l'ordi. Mais pour lire les listes à puces (LIST) : le narrateur bugue !!! J'ai Windows 10. Peut-être que ça marcherait avec le narrateur de Windows 11?Vous ne pouvez pas lire les posts avec des listes à puces (LIST) ou vous ne pouvez pas répondre "facilement" à ces posts ?
Je sais ce qu'est une strusture en C, mais je ne peux pas l'expliquer, à cause de mes troubles du langage (aphasie). Je vois un peu la différence entre la structure en C et en C++, mais ce n'est pas clair du tout pour moi.Pouvez-vous résumer en quelques mots ce qu'est une structure en C ?
Quelles différences entre une structure C et une structure en C++, toujours en quelques mots ?
J'ai appris C++ par moi-même après mon AVC, donc c'est compliqué pour moi.
Non, je ne peux pas l'expliquer; ce n'est pas clair pour moi. En plus, je ne peux pas écrire des phrases complètes tout seul.Pouvez-vous expliquer ce que vous avez compris du fonctionnement actuel de votre programme ?
Je pourrais voir là où vous faites fausse route dans votre compréhension du programme.
Là, c'est mon orthophoniste qui écrit ce que je veux dire.
Pour moi, ce serait vraiment plus facile si vous donniez des indications peu à peu, de façon courte. Lire une très grande page d'explications est très décourageant car ça me prend des heures.
-------------------------------------------
(Moi même !)
Mais, 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
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 int wmain(int argc, wchar_t* argv[]) { ... const std::wstring racine = t + L"Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga"; ... bool found = false; std::wregex film_pattern{ L"(.+?)(?:\\.\\((\\d{4}\\-\\d{2}\\-\\d{2}\\s)?([^\\)]*)\\))?(?:\\.(.+))?" }; std::wsmatch match; if (!found && std::regex_match(nomDossier, match, film_pattern)) { Film film(racine); found = true; for (const auto& entry_film : fs::directory_iterator((film.getRacine()))) { if (entry_film.is_regular_file()) { film.initialiser_Fichier(entry_film); continue; } } film.Print(); found = true; } if (!found) { std::wregex serie_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" }; std::wsmatch match2; if (!found && std::regex_match(nomDossier, match2, serie_pattern)) { Serie serie(racine); for (const auto& entry_serie : fs::directory_iterator((serie.getRacine()))) { if (entry_serie.is_regular_file()) { serie.initialiser_Fichier(entry_serie); continue; } if (fs::is_directory(entry_serie)) { Saison saison(entry_serie, serie); for (const auto& entry_saison : fs::directory_iterator(entry_serie)) { if (entry_saison.is_regular_file()) { saison.initialiser_Fichier(entry_saison); } } serie.saisons.push_back(saison); } } serie.Print(); } } ... }Je n'y arrive pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part const std::wstring racine = t + L"Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga";
Merci
Bonsoir,
Exemple serie.cpp :
Ok ! Mais, tant pis !
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 const void Serie::Print_Header() { ... if (affichage_sur_actif && m_sur != L"" && m_sur != L"Disney+" && m_sur != L"Netflix") { sur_str += keyColor[0] + L" (" + keyColor[1] + L"sur " + valuesColor + m_sur + keyColor[0] + L')' + valuesColor; } if (affichage_sur_actif && (m_sur == L"Disney+" || m_sur == L"Netflix")) { sur_str += keyColor[0] + L" (" + keyColor[1] + L"sur " + valuesColor + m_sur + keyColor[1] + L" : " + valuesColor; // Disney+ SJ if (affichage_disney_sj_actif && m_disney_sj.length() != 0) sur_str += m_disney_sj; // Netflix SJ if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0) sur_str += m_netflix_sj; sur_str += keyColor[0] + L')' + valuesColor; } else { // Disney+ SJ if (affichage_disney_sj_actif && m_disney_sj.length() != 0) sur_str += keyColor[0] + L" (" + valuesColor + L"Disney+" + keyColor[1] + L" : " + valuesColor + m_disney_sj + keyColor[0] + L')' + valuesColor; // Netflix SJ if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0) sur_str += keyColor[0] + L" (" + valuesColor + L"Netflix" + keyColor[1] + L" : " + valuesColor + m_netflix_sj + keyColor[0] + L')' + valuesColor; } ... }
Et :
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison } { ... if (file_content.size() > 2) { //file_content.erase(file_content.begin()); //bof à revoir //file_content.erase(file_content.begin()); //bof à revoir file_content.erase(file_content.begin(), file_content.begin() + 1); m_resume = file_content; } }
Pour l'utilisation des "puces", je ne les utiliserai plus ici.
J'ai ouvert un sujet sur le forum lié aux évolutions "des forums", pour voir s'il s'agit d'un problème connu. (voir s'il y a une solution de "contournement")
Pour les longs messages, comme vous faites beaucoup de messages entre chacune de mes réponses, que les questions n'y sont pas forcément très claires et que vous ne répondez pas aux questions de mes réponses précédentes, cela fait mécaniquement augmenter la taille des réponses suivantes, pour ne pas "perdre" de sujets.
Mais comme cela part dans tous les sens. Je vais vraisemblablement "élaguer" des choses, quitte à revenir après sur le sujet.
Je vais donc répondre à mes propres questions car vous ne semblez pas pouvoir "facilement" y répondre. (Si vous ne comprenez pas la réponse indiquez le moi explicitement et ce que vous ne comprenez pas dans mon "autoréponse").
- Une structure de données en C est un regroupement d'informations/données.
- Uns structure de données en C++, c'est comme une structure en C, mais on n'y ajoute les fonctions nécessaires à l'initialisation des données (via le constructeur) et la manipulation "cohérente" de ces données (c'est une très mauvaise définition mais c'est un début et on verra plus tard comment utiliser/concevoir "correctement" une structure/classe C++).
- L'architecture du programme s'articule en 3 "étapes" :
-> initialisation de l'environnement d'exécution (lignes 440 à 470 d'Exemple.cpp)
-> création d'une arborescence d'objets contenant les informations qui nous intéressent (cf. le schéma ci-après) (lignes 476 à 530 d'Exemple.cpp)
-> affichage des informations récoltées dans la console (ligne 531 d'Exemple.cpp)
(Le découpage est assez "arbitraire" car le code est assez mal structuré, mais c'est pas très compliqué à corriger.)
Schéma de l'arborescence des objets créées pendant la 2ème étape du programme :
Il y a les lignes noirs qui vont du tronc de l'arbre, ici le seul et unique objet "Serie" créé ligne 509 d'Exemple.cpp, vers les feuilles : les séquences de visionnages.
saisons -> m_liste_episodes -> m_liste_sequence_visonnages
Il y a aussi les flèches de couleurs, qui vont dans l'autre sens, des feuilles vers le tronc.
m_episode -> m_saison -> m_serie
"UneFonctionDeLaClasseSequenceVisionnage", c'est juste le nom d'une fonction quelconque de la classe SequenceVisionnage, qu'elle existe déjà ou une future/nouvelle fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(...) { ... auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this); ... }Pouvez-vous expliquer ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(???)
Elle ne devrait jamais s'appeler "UneFonctionDeLaClasseSequenceVisionnage" car cela n'a pas de signification "valable".
Déjà expliqué :Oui ! Comment faire ?(foireuse cette boucle, utilisez plutôt une "range-based for loop")
Les "boucles" ("range-based for loop") permettent d'aller dans toutes les "branches/feuilles" de l'arborescence (de gauche à droite sur le schéma ci-avant).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 const void Serie::Print_Saisons() { if (affichage_saisons_actif) { for (auto saison : saisons) { Print_Saison(saison); } } }
Bin, c'est vous qui devez me donner un exemple d'accès à des données qui vous bloque.Ben, alors, ... ???
On va le faire pas à pas.Rien compris !!!
Donnez-moi à quoi doit ressembler l'affichage des informations, SVP.
Heu, bon si, c'est pas vous qui choisissez comment fonctionnent les expressions régulières, vous devez savoir comment elles fonctionnent pour pouvoir vous en servir correctement.Ben, non !
C'est pas forcement évident, la preuve, un mème qu'un collèque vient de m'envoyer :
https://www.topito.com/top-gif-code-developpeur
Rien compris, en plus le code qui suit ne correspond pas aux formats et n'utilise pas d'expression régulière.Ben, non :
Exemple :
Phrase
Ben oui !
Phrase / verber
Phrase : titre !
verbre : sous-titre !
Et :
Message du "16/07/2024, 10h13":
Quel est la question ?
Quel rapport avec les pages Web.
J'ai déjà signalé que votre approche n'est pas adaptée à la récupération d'information via du "scrapping" de site Web.
Message du "16/07/2024, 22h25"
Bin normale, "match[1]" contient l'année de départ et "match[2]" est le mois de départ, qui n'est pas renseigné, donc "match[2].matched" est 'false'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if (match[2].matched) // Marches pas !!!
Message du "17/07/2024, 15h22" :
Pouvez-vous utiliser le débugueur pour voir où cela ne fonctionne pas ?
Comme vous ne nous donnez pas le format des noms de fichiers mais juste des cas d'utilisation, cela complexifie inutilement l'expression régulière : quel est donc le format des noms de fichiers, SVP ?
Vous devriez être capable de corriger vous-même cette erreurErreur C4716:
Rrr !!!
Je ne comprends pas, vous me demandez de faire du pas-à-pas sur du code que vous avez vous-même créé.Compliqué !
Pas-à-pas !!!
Pourquoi vous emmerdez avec un std::tm, quand vous n'avez pas de "time" ???===> std::tm tm{ -1, -1, -1, -1, -1, -1, -1, -1, -1 };
Ici, c'est un peu compliqué.Je n'y arrive pas !
Code : Sélectionner tout - Visualiser dans une fenêtre à part const std::wstring racine = t + L"Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga";
Vous avez 4 motifs possibles (alternatives) :
\\d{4}\\s => Année + un espace
\\d{4}\\-\\d{4}\\s => "Année1 - Année2" + un espace
\\d{4}\\-\\s => "Année-", comme dans "Tracker.[2024-]", + un espace (et c'est pour ça que cette formule échoue pour "Tracker.[2024-]"
\\d{4} => Année
Les alternatives sont évaluées dans l'ordre dans lequel elles apparaissent dans l'expression régulière.
Donc, pour ne pas avoir de problème, vous devriez commencer par les alternatives les plus longues puis les un peu plus courtes, etc... jusqu'aux plus courtes.
Pour le cas "Tracker.[2024-]", il n'y a pas d'alternavite qui accepte ce motif.
Le plus simple, c'est d'ajouter le motif "\\d{4}\\-" aux autres, mais en respectant l'ordre "du plus long au plus court".
Faites des tests avec https://regex101.com pour comprendre comment ça fonctionne. Mais commencez avec des cas simples.
Une fois que vous avez une expression régulière qui fonctionne avec le nouveau format, ajoutez l'alternative correspondante à la la capture qui est entre parenthèses "()" en respectant l'ordre "du plus long au plus court".
Pour rappel, les différentes alternatives d'une capture sont séparées par un caractère "|" (pipe).
Je suis encore en train de faire un message à rallonge pour répondre à toutes vos "interrogations" mais comme vous faites au moins 3 versions entre chacune de mes réponses et que vous modifiez énormément de code à chaque fois, sans vraiment le simplifier, ça tombe toujours à coté.
Je vous demande de poster une version, avec UNE question qui correspond à l'étape que vous voulez atteindre grâce à une réponse de ma part, et d'attendre ma réponse avant dans poster d'autres versions et d'autres questions, SVP.
Dans la (l'une des) version(s) sous Git "Juillet 20 (23/07/2024)", les "lInfoQuiMInteresse" et "Une_Fonction_De_La_Classe_SequenceVisionnage" ne devraient pas exister (à moins que c'est pour vos tests de compréhension).
Il y a quasiment systématiquement 2 versions avec le même nom dans Git, faudrait configurer votre client Git pour qu'il nomme "correctement" (de manière unique) les versions sous Git.
Dans cette même version, si vous utilisez correctement le débugueur pour faire du pas à pas, vous devriez voir que la ligne 505 d'Exemple.cpp
pose un problème avec le répertoire
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wregex serie_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" };
Car l'expression régulière ne gère pas le fait qu'une paire d'année ne soit pas suivi par un espace.
Code : Sélectionner tout - Visualiser dans une fenêtre à part const std::wstring racine = t + L"Star Wars- The Clone wars.[2008-2020].Animation";
Mais cela ne crée pas de disfonctionnement immédiat car le test "std::regex_match(nomDossier, match2, serie_pattern)" est toujours bon, même si le découpage en motif est foireux.
On a la même expression régulière un peu plus loin dans le code, ligne 1236 de serie.cpp, "std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?")", qui pose le même problème mais qui entraîne ici un disfonctionnement car le découpage foireux a un impact dans la suite du code.
(Avoir la même expression régulière à 2 endroits différents du code, c'est vraiment pas terrible)
En réordonnant les alternatives de la plus longues à la plus courte et en ajoutant la nouvelle alternative (en rouge dans le code ci-après), et en corrigeant aussi l'expression régulière ligne 1248, ça donne :
Avec ce code, les champs m_f_anneesProduction.first et m_f_anneesProduction.second sont correctement *initialisés.
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 Serie::Serie(std::filesystem::path racine) { this->racine = racine; auto nomDossier = racine.filename().wstring(); assert(nomDossier.length() > 0 && L"Nom de dossier vide"); std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" }; std::wsmatch match; if (std::regex_match(nomDossier, match, filename_pattern)) { std::wstring titres = match[1]; m_titres = Dossier_Titres(titres); if (match[2].matched) { std::wstring annees_str = match[2].str(); std::wsmatch dummy; if (std::regex_match(annees_str, dummy, std::wregex(L"\\d{4}\\-\\d{4}\\s?"))) { m_f_anneesProduction.first = stoi(annees_str); m_f_anneesProduction.second = stoi(annees_str.substr(5)); } else { m_f_anneesProduction.first = stoi(annees_str); } } m_sur = (match[3].matched) ? match[3].str() : L""; std::wstring sous_genre = (match[4].matched) ? match[4].str() : L""; m_sous_genre = sous_genre; } else { assert(false == true && "Le nom du répertoire n'est pas un nom valide."); } }
On peut, je pense, simplifier les expressions régulières mais vous devez nous donner le format des noms de répertoires/fichiers de manière plus synthétique.
P.S.: est-ce que des schémas comme dans ce post vous permet de mieux comprendre ?
Bonjour,
Ben oui ! Mais, j'ai perdu en capacité !!! C'est vrai ! L'AVC !Je vais donc répondre à mes propres questions car vous ne semblez pas pouvoir "facilement" y répondre. (Si vous ne comprenez pas la réponse indiquez le moi explicitement et ce que vous ne comprenez pas dans mon "autoréponse").
- Une structure de données en C est un regroupement d'informations/données.
Ben non !- Uns structure de données en C++, c'est comme une structure en C, mais on n'y ajoute les fonctions nécessaires à l'initialisation des données (via le constructeur) et la manipulation "cohérente" de ces données (c'est une très mauvaise définition mais c'est un début et on verra plus tard comment utiliser/concevoir "correctement" une structure/classe C++).
Ok, vous avez peut-être une définition plus "exacte" de ce qu'est une structure en C++.Ben non !
Pouvez-vous m'indiquer en quelques mots, avec des exemples si nécessaire, ce qui vous fait dire que "ma" définition simpliste n'est pas la "bonne" ?
Si, c'est "non, je ne sais pas", vous n'avez retenir que ce que j'ai indiqué :
Voulez-vous des schéma graphiques plus "propres" pour vous aider dans la compréhension de l'arborescence de fichier ?Une structure de données en C++, c'est comme une structure en C, mais on n'y ajoute les fonctions nécessaires à l'initialisation des données (via le constructeur) et la manipulation "cohérente" de ces données (c'est une très mauvaise définition mais c'est un début et on verra plus tard comment utiliser/concevoir "correctement" une structure/classe C++).
Avez-vous "compris" la correction de la fonction "Serie::Serie(std::filesystem::path racine)" que j'ai proposé dans mon précédent post.
Bonjour,
Peux dormir !
Un peux :Ok, vous avez peut-être une définition plus "exacte" de ce qu'est une structure en C++.
Exemples : https://zestedesavoir.com/tutoriels/...-en-c-moderne/
https://zestedesavoir.com/tutoriels/...-les-fichiers/Après, c'est dure !!!
...
https://zestedesavoir.com/tutoriels/...-discographie/
Ben non !Pouvez-vous m'indiquer en quelques mots, avec des exemples si nécessaire, ce qui vous fait dire que "ma" définition simpliste n'est pas la "bonne" ?
Si, c'est "non, je ne sais pas", vous n'avez retenir que ce que j'ai indiqué :
Ok ! Oui !!!Voulez-vous des schéma graphiques plus "propres" pour vous aider dans la compréhension de l'arborescence de fichier ?
Comment faireAvez-vous "compris" la correction de la fonction "Serie::Serie(std::filesystem::path racine)" que j'ai proposé dans mon précédent post.et"compris"Avant ou plus tard ?"précédent post"
Merci
Ok, ça va être compliqué.
Ce cours fait des simplifications pédagogiques, comme moi, pour permettre l'apprentissage.
Je ne fais pas les mêmes simplifications, car j'essaye de simplifier le propos en fonction de ce que j'essaye de comprendre de vos difficultés.
Donc, un peu d'indulgence "épistémique", SVP.
https://zestedesavoir.com/tutoriels/...-en-c-moderne/
Page générale, table des matières du cours, rien de précis par rapport à ce que je vous avais demandé/expliqué.
https://zestedesavoir.com/tutoriels/...-les-fichiers/
Idem, je vois pas trop le rapport avec ce que je vous avait demandé/expliqué.
https://zestedesavoir.com/tutoriels/...-discographie/
Les structures "Artiste", "Album" ou "Morceau" dans l'article du lien ci-dessus sont des structures qui correspondent à MA définition de structure C, et non C++. Ce type de structure est créable quasi identiquement en C.
Le tutoriel que vous donnez en référence n'a pas été conçu pour aider les programmeurs C à comprendre les différences avec le C++.
Ils nomment "structures C++" un usage très très simplifié des "classes/structures C++" pour mettre le pied à l'étrier à des personnes sans expériences de la programmation.
Quand ce tutoriel (au moins au début) indique "structures C++", il faut comprendre "structure à la C", selon ma définition.
Je n'ai pas lu ce tutoriel, juste survolé, mais ils indiquent que la partie POO n'est pas fini, et c'est la POO qui différentie principalement le C du C++ (au moins au début).
De ce que j'ai survolé, une utilisation C++ d'une structure est faite ici :
https://zestedesavoir.com/tutoriels/...ien-serviables
Dans la structure "Fraction" qui y est présentée, on commence à y insérer des comportements ( par exemple : "simplification()") , pas juste des données ("numerateur" ou "denominateur").
C'est cette différence que je cherche à vous montrer.
Est-ce que vous comprenez maintenant cette différence entre une "structure à la C" et une "structure/class C++" ?
"Ben non !", non quoi ???
Si c'est un refus, vous devez me faire confiance.
Ce qui est indiqué comme "structure C++" dans le tutoriel que vous référencé sont des "structures à la C".
Vous devez comprendre la différence avec une "structure/class C++".
Si "Ben non !", c'est pour votre incapacité à voir la différence, on revient sur le fait qu'une "structure/class C++" contient des comportements (rend des services) en plus de stocker des infirmations.
C'est la différence entre une structure "Artiste", "Album" ou "Morceau" : "structures à la C" ; et la "structure/class C++" Fraction (qui a un comportement/service "simplification" en plus des données).
Je vous fournis un schéma de classe avec le formalisme UML (fait avec de lointain souvenirs, si des personnes peuvent me corriger ce schéma SVP)
Si vous avez lu des livres sur la POO, ils ont dû aborder les notations UML.
Je ne trouve pas cela forcément beaucoup plus clair, mais c'est normé et ça fait "plus propre" (moins bricolé).
Si c'est moins lisible pour vous, on fera avec un formalisme moins "standardisé".
Mais vous devriez poser des questions aussi, SVP.
Je vous donne un nouveau code qui fonctionne mieux dans mes post.
Vous n'avez qu'à voir les différences avec le vôtre, comprendre pourquoi celui que je fournis fonctionne mieux que celui d'avant.
Si vous ne comprenez pas pourquoi j'ai fait ces corrections, essayez, avec le débugueur de voir les différences de comportement des 2 codes (le vôtre, et celui que je fourni).
Bin là où j'ai posté le code de la fonction "Serie::Serie(std::filesystem::path racine)".
post du : 24/07/2024, 20h04
Je suis dans le brouillard au niveau de votre niveau de compréhension.
Comprenez-vous maintenant l'architecture générale en 3 étapes du programme ?
Avez-vous compris le mécanisme de création de l'arborescence d'objets construire dans la 2ème étape du programme ?
Qu'est-ce qui vous empêche actuellement de mieux maitriser le programme ?
Si c'est des lignes de code qui ne sont pas claires pour vous, donnez-nous les premières de celles-ci.
Pas fini !!!De ce que j'ai survolé, une utilisation C++ d'une structure est faite ici :
https://zestedesavoir.com/tutoriels/...ien-serviables
Dans la structure "Fraction" qui y est présentée, on commence à y insérer des comportements ( par exemple : "simplification()") , pas juste des données ("numerateur" ou "denominateur").
C'est cette différence que je cherche à vous montrer.
Est-ce que vous comprenez maintenant cette différence entre une "structure à la C" et une "structure/class C++" ?
Mais :
https://github.com/laurentbouleau/Exemple : Juillet 21 (27/07/2024)
Vous continuez à ajouter des fonctionnalités (comme l'affichage des durées) sans avoir appliqué aux moins 70% de nos (mes) remarques.
Vous n'allez jamais stabiliser votre programme en continuant comme ça.
Maitrisez les concepts avant de vous en servir (mal) ailleurs.
Votre code devrait fonctionner sans problèmes majeurs avant d'en ajouter. Sinon, vous vous prendrez la tête sur de "faux" problèmes pendant des heures, pour pondre du mauvais code, encore et encore.
Quasiment tous les nouveaux codes sont bancals car concepts encore mal maitrisés ou non prise en compte de nos remarques.
Par exemple :
Dans le constructeur d'InfosVisionnage, à la fin:
Vous avez remplacé
Par
Code : Sélectionner tout - Visualiser dans une fenêtre à part file_content.erase(file_content.begin(), file_content.begin() + 0);
Mais vous n'avez pas testé ou mal compris le résultat de l'exécution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part file_content.erase(file_content.begin(), file_content.begin() + 1);
https://cplusplus.com/reference/vector/vector/erase/
La documentation indique bien que l'élément "pointé" par le second paramètre ne sera supprimé.
C'est donc le code suivant qu'i faut utiliser :
Testez toujours le code que vous modifiez.
Code : Sélectionner tout - Visualiser dans une fenêtre à part file_content.erase(file_content.begin(), file_content.begin() + 2);
(Mais c'est bien que vous ayez pris un peu de temps pour nettoyer le code un peu sale que j'avais fourni)
Dans la fonction "void SequenceVisionnage::Une_Fonction_De_La_Classe_SequenceVisionnage(...)" :
Vous avez mis en commentaire la seule ligne qui avait un sens :
La fonction "void SequenceVisionnage::Une_Fonction_De_La_Classe_SequenceVisionnage(...)" n'a pas de sens en elle même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part //auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this); // ??? #804
J'avais donné un nom de fonction comme celui-ci pour indiquer n'importe quelle fonction de la classe, pas pour en créer une avec ce nom en particulier.
C'est la même logique pour les paramètres "...", c'était pour ne pas donner une liste de paramètres en particulier.
Vous ne devriez jamais utiliser ce type de liste de paramètres, car "..." a un sens très précis qui n'a rien a voir avec ce que vous semblez penser.
Désolé pour les noms de fonction "Une_Fonction_De_La_Classe_xxx", les listes de paramètres "..." ou encore les champs "lInfoQuiMInteresse", c'était pour illustrer mon propos avec des noms "génériques", pas à prendre "au pied de la lettre".
Pour la fonction "void Episode::GetNumeroSequenceVisionnage(const SequenceVisionnage& sev_vis)", le type de la valeur de retour de la fonction : "void", n'est pas cohérent avec l'utilité de la fonction : "GetNumeroXXX", c'est pour récupérer un numéro, pas "rien".
Mais comme déjà indiqué, je ne suis pas sûr que la fonction "Episode::GetNumeroSequenceVisionnage(const SequenceVisionnage& sev_vis)" est un intérêt. (cf. les fonctions "PrintFirstSequenceVisionnage" et "PrintSequenceVisionnage" de la classe Episode)
Implémenter "correctement" cette fonction demanderait une bonne maitrise des arcanes du C++.
Stabilisez votre code existant avant de vouloir en ajouter.
Pour la fonction "void Film::initialiser_Duree(std::wstring& m)", l'expression régulière "([01234])?" est très insuffisante pour des valeurs comme "2h 42min" dans "Avatar.(2009-12-16)\Titre.txt".
https://regex101.com/r/Cjhee3/1
Vous ne capturez que le premier "2".
Il faut juste un peu de méthode.
Le format de la durée est composé de 2 parties optionnelles.
- Le nombre d'heures
- Le nombre de minutes "restantes"
Ces 2 parties peuvent être séparées par un espace.
On va donc avoir 2 parties distinctes dans l'expression régulière.
La première partie, c'est le nombre d'heure, donc un ou plusieurs chiffres suivis d'un "h" : \d+h
On veut récupérer/capturer justes les chiffres, donc on ajoute des parenthèses autour de "\d+" : (\d+)h
Il se peut que cela doit un "H" et pas un "h", alors il faut faire une alternative entre "h" et "H" : (\d+)(h|H)
(il y a la possibilité de rendre l'expression régulière "case insensitive" mais pour un point de vue pédagogique, on ne l'utilise pas ici.)
Comme on ne veut pas savoir si c'est un "h" ou un "H", on ajoute un "?:" au début du contenu de la seconde pair de parenthèse : (\d+)(?:h|H)
La seconde partie, c'est le nombre de minutes, donc un ou plusieurs chiffres suivis d'un "min" : \d+min
En appliquant le même raisonnement que pour la partie heure, on obtient : (\d+)(?:min|MIN)
Si on veut récupérer les 2 parties d'un coup, quand elles sont séparées par un espace, on les écrit cote à cote, en spécifiant le séparateur entre, ici "\s" pour l'espace : (\d+)(?:h|H)\s(\d+)(?:min|MIN)
Comme l'espace qui sépare les 2 parties n'est pas obligatoire, on va le rendre optionnel dans l'expression régulière : (\d+)(?:h|H)\s?(\d+)(?:min|MIN)
Comme la première partie n'est pas obligatoire, on va l'encapsulé dans une "capture" optionnelle : (?:(\d+)(?:h|H))?\s?(\d+)(?:min|MIN)
Idem pour la seconde partie qui n'est pas obligatoire : (?\d+)(?:h|H))?\s?(?:(\d+)(?:min|MIN))?
A la fin :
(?\d+)(?:h|H))?\s?(?\d+)(?:min|MIN))?
On aura donc le nombre d'heures dans la capture "1" et le nombre de minutes dans la capture "2". (La capture "0" contient toute la chaine analysée)
En ajoutant un "^" au début et un "$" à la fin pour respectivement correspondre à un début de ligne et à une fin de ligne, ça donne cela dans l'évaluateur en ligne :
https://regex101.com/r/sXgN87/1
Bonjour,
https://github.com/laurentbouleau/Exemple : Juillet 22 (28/07/2024)
Pas fini !!! Cercle !!!De ce que j'ai survolé, une utilisation C++ d'une structure est faite ici :
https://zestedesavoir.com/tutoriels/...ien-serviables
Dans la structure "Fraction" qui y est présentée, on commence à y insérer des comportements ( par exemple : "simplification()") , pas juste des données ("numerateur" ou "denominateur").
C'est cette différence que je cherche à vous montrer.
Est-ce que vous comprenez maintenant cette différence entre une "structure à la C" et une "structure/class C++" ?
Mais :
Pourquoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (affichage_duree_actif) { duree_str = L' ' + std::to_wstring(m_duree / (60 * 60)) + keyColor[0] + L"h" + valuesColor + L' ' + std::to_wstring(m_duree / 60) + keyColor[0] + L"min " + valuesColor; }
---------------
Ça ne fonctionne pas ! Pourquoi ?Dans la fonction "void SequenceVisionnage::Une_Fonction_De_La_Classe_SequenceVisionnage(...)" :
Vous avez mis en commentaire la seule ligne qui avait un sens :
...
La fonction "void SequenceVisionnage::Une_Fonction_De_La_Classe_SequenceVisionnage(...)" n'a pas de sens en elle même.
J'avais donné un nom de fonction comme celui-ci pour indiquer n'importe quelle fonction de la classe, pas pour en créer une avec ce nom en particulier.
C'est la même logique pour les paramètres "...", c'était pour ne pas donner une liste de paramètres en particulier.
Vous ne devriez jamais utiliser ce type de liste de paramètres, car "..." a un sens très précis qui n'a rien a voir avec ce que vous semblez penser.
Désolé pour les noms de fonction "Une_Fonction_De_La_Classe_xxx", les listes de paramètres "..." ou encore les champs "lInfoQuiMInteresse", c'était pour illustrer mon propos avec des noms "génériques", pas à prendre "au pied de la lettre".
Pour la fonction "void Episode::GetNumeroSequenceVisionnage(const SequenceVisionnage& sev_vis)", le type de la valeur de retour de la fonction : "void", n'est pas cohérent avec l'utilité de la fonction : "GetNumeroXXX", c'est pour récupérer un numéro, pas "rien".
Mais comme déjà indiqué, je ne suis pas sûr que la fonction "Episode::GetNumeroSequenceVisionnage(const SequenceVisionnage& sev_vis)" est un intérêt. (cf. les fonctions "PrintFirstSequenceVisionnage" et "PrintSequenceVisionnage" de la classe Episode)
Implémenter "correctement" cette fonction demanderait une bonne maitrise des arcanes du C++.
Stabilisez votre code existant avant de vouloir en ajouter.
Et :
Ok !Prey.(2022-08-05 Disney+)
Se reposer !!!
Vous posez des questions toujours sur le "nouveau" code sans prendre la peine de corriger l'ancien, on arrivera à rien comme ça.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (affichage_duree_actif) { duree_str = L' ' + std::to_wstring(m_duree / (60 * 60)) + keyColor[0] + L"h" + valuesColor + L' ' + std::to_wstring(m_duree / 60) + keyColor[0] + L"min " + valuesColor; }
Ici, vous avez oublié de soustraire le nombre de minutes déjà compté dans les heures.
Code : Sélectionner tout - Visualiser dans une fenêtre à part duree_str = L' ' + std::to_wstring(m_duree / (60 * 60)) + keyColor[0] + L"h" + valuesColor + L' ' + std::to_wstring((m_duree -((m_duree / (60 * 60))*60*60))/ 60) + keyColor[0] + L"min " + valuesColor;Quel rapport avec les concepts de base du C++ ???Pas fini !!! Cercle !!!
Pourquoi voulez-vous que cela marche, si vous ne nous écoutez pas et continuez à pondre du code sans corriger l'existant ?Ça ne fonctionne pas ! Pourquoi ?
Attention, les parties sont optionnelles!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void Film::initialiser_Duree(std::wstring& m) { const std::wregex duree_format_rg{ L"^(?:(\\d+)(?:h|H))?\\s?(?:(\\d+)(?:min|MIN))?$" }; std::wsmatch match; if (std::regex_match(m, match, duree_format_rg)) { auto duree_en_heure = std::stoi(match[1]); auto duree_en_minute = std::stoi(match[2]); m_duree = duree_en_heure * 60 * 60 + duree_en_minute * 60; } else { throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide."); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part m_duree = (match[1].matched ? std::stoi(match[1]) : 0) * 60 * 60 + (match[2].matched ? std::stoi(match[2]) : 0) * 60;
Bonjour,
https://github.com/laurentbouleau/Exemple : Juillet 23 (29/07/2024)
Attention : Film : Je sais faire, tout seul !!! (Enfin, peux être !!!).
https://zestedesavoir.com/tutoriels/...ien-serviables
const noexcept, noexcept et return distance(cercle.centre, point) <= cercle.rayon;Et :
https://zestedesavoir.com/tutoriels/...ruire-tout-ca/
m_, default, delete
Merci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void SequenceVisionnage::Une_Fonction_De_La_Classe_SequenceVisionnage(...) { auto uneInfoDeLEpisode = m_episode.lInfoQuiMInteresse; auto uneInfoDeLaSaison = m_episode.m_saison.lInfoQuiMInteresse; auto uneInfoDeLaSerie = m_episode.m_saison.m_serie.lInfoQuiMInteresse; auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this); // ??? #804 }
Comme faire ???
GetNumeroSequenceVisionnage(*this)Pas compris !!!
Merci
Bonjour,
Pas dormir !!!
https://github.com/laurentbouleau/Exemple : Juillet 24 (30/07/2024)
Je ai marre !!!
Merci
https://github.com/laurentbouleau/Exemple : Août 01 (01/08/2024)
Ben, non ! Que faire ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 const Episode* SequenceVisionnage::Une_Fonction_De_La_Classe_SequenceVisionnage_xxx(...) { auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this); // ??? #804 return *NumeroSequenceVisionnage; }
Tant pis !
Bonjour,
Je n'ai arrive pas ! Je ne sais plus comment faire ! Pouvez-vous expliquer ? Et pas-à-pas !
Google :
Pas de solution !!!c++ pointeur et fonction
c++ pointeur sur fonction
c++ pointeur par fonction
c++ pointeur avec fonction
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this); // ??? #804
Je suis perdu !!!Schéma de l'arborescence des objets créées pendant la 2ème étape du programme :
Excusez-moi ! Les jours : 2h ou 3h = je suis crevé !
Désolé !!!
Merci
Class/Struct : T ?
pointeur et fonction ?
Comment fait ?
Struct SequenceVisionnage, ou struct Episode ?
Je suis fatigue !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this); // ??? #804
Merci beaucoup
Bonsoir,
https://github.com/laurentbouleau/You---Copie : Août 02 (04/08/2024)
https://github.com/laurentbouleau/Exemple : Août 02 (04/08/2024)
L'exemple (serie.cpp) :
Ben non !!!
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 void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre) { // Titre ... std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s?|\\d{4}\\-\\s?|\\d{4}\\s?)?([^\\]]*)\\])?(?:\\.(.+))?" }; std::wsmatch match; if (std::regex_match(contenu[0], match, filename_pattern)) { t.push_back(match[1]); if (match.length() > 2) { t.push_back(match[2]); } if (match.length() > 3) { t.push_back(match[3]); } } else { t.push_back(contenu[0]); } ... }
L'exemple :
Ok 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
29
30
31
32
33
34
35
36
37 ... std::size_t pos = 0; ... const std::wstring d_p = L" : "; pos = file_content[0].find(d_p); bool found = false; if (!found && pos != std::wstring::npos) { m_titres.push_back(file_content[0].substr(0, pos)); m_titres.push_back(d_p); m_titres.push_back(file_content[0].substr(pos + 3)); found = true; } const std::wstring d_p2 = L": "; pos = file_content[0].find(d_p2); if (!found && pos != std::wstring::npos) { m_titres.push_back(file_content[0].substr(0, pos)); m_titres.push_back(d_p2); m_titres.push_back(file_content[0].substr(pos + 2)); found = true; } const std::wstring d_p3 = L"/"; pos = file_content[0].find(d_p3); if (!found && pos != std::wstring::npos) { m_titres.push_back(file_content[0].substr(0, pos)); m_titres.push_back(d_p3); m_titres.push_back(file_content[0].substr(pos + 1)); found = true; } if (!found) { m_titres.push_back(file_content[0]); found = true; } ...
Merci d'avance
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