IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème et AVC : _wfopen_s


Sujet :

C++

  1. #1141
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    Ah ! Très bien ! Mais, je dors !!! Plus tard !

  2. #1142
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 04 (04/03/2025)

    Si je comprends "bien", vous voulez que les 0 en début de numéro d'épisode ne servent que de "padding" pour que tous les numéros d'une saison est la même longueur ?
    Normalement, vous devriez être capable de le faire vous-même.
    Une solution à l'arrache :
    Ok !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numero_str = std::to_wstring(m_episode.m_saison.m_numero) + m_keyColor[1] + L'x' + m_valuesColor + ((m_episode.m_numero < 10 && m_episode.m_saison.m_nombre_episodes>10) ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + m_valuesColor;
    Ok !

    Mais : serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::wstring Serie::calcul_Duree_affichage() const
    {
        std::wstring duree_str;
        long minutes = (m_duree % (60 * 60)) / 60;
        long secondes = m_duree % 60;
        duree_str = L' ' + std::to_wstring(minutes) + m_keyColor[0] + m_espace3 + (minutes <= 1 ? m_labelMinuteSingulier : m_labelMinutePluriel) + m_valuesColor;
        return duree_str;
    }
    Kaleidoscope et Love, Death + Robots : 0min !!!
    Et : sans épisodes !!! (en mince...)

  3. #1143
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    std::wstring Serie::calcul_Duree_affichage() const
    Vous faites toujours les mêmes erreurs.
    Utilisez le débugueur.

    Vous aviez le même problème dans la fonction "SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const".

    Comparez les 2 codes.

    Vous verrez que ce " % (60 * 60)" n' aucun sens si "m_duree" de serie fonctionne comme "m_duree_en_second" de SequenceVisionnage.
    "(60 * 60)", c'est pour convertir des heures en secondes.

    La similitude entre les 2 fonctions montre, encore une fois, qu'enlever le code d'affichage de ces classes métier permettrait une grande factorisation du code.

  4. #1144
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 05 (04/03/2025)
    Bon, ils fonctionnent !

    Pourquoi :
    std::wstring Serie::calcul_Duree_affichage() const : m_duree
    et
    std::wstring SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const : m_duree_en_seconde
    ???

    Merci

  5. #1145
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Pourquoi :
    std::wstring Serie::calcul_Duree_affichage() const : m_duree
    et
    std::wstring SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const : m_duree_en_seconde
    Ne voyez-vous pas que c'est quasiment le même code et qu'il serait plus "malin" de factoriser le code ?
    Factoriser le code : fusionner les parties pour en faire un seul bloc utilisable à plusieurs endroits, en en faisant une fonction libre, par exemple : "std::wstring miseEnFormeDuree(long dureeEnSeconde, xyz)"

    EDIT :
    m_duree Versus m_duree_en_seconde ???

    Bin c'est vous qui n'avez pas suivi les mêmes règles de nommage dans ces 2 classes.
    Il faudrait donc mieux renommer le champ m_duree de la classe Serie en m_duree_en_seconde (utilisez la fonctionnalité de Visual Studio pour le faire, pas à la main, SVP) pour que cela soit plus explicite.

  6. #1146
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 06 (06/03/2025)

    Ne voyez-vous pas que c'est quasiment le même code et qu'il serait plus "malin" de factoriser le code ?
    Factoriser le code : fusionner les parties pour en faire un seul bloc utilisable à plusieurs endroits, en en faisant une fonction libre, par exemple : "std::wstring miseEnFormeDuree(long dureeEnSeconde, xyz)"
    Ok !

  7. #1147
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Le nom et l'ordre des paramètres de la nouvelle fonction sont perfectibles, mais vous avez compris la logique. très bien.

  8. #1148
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 07 (06/03/2025)

    serie.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct InfosVisionnage
    {
    ...
        long m_NumeroSaison{};
        long m_NumeroEpisode{};
        bool m_Chiffres_ou_pas{ true };
    ...
    };
    serie.cpp :
    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
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    { 
    ...
        if (file_content.size() > 0)
        {
            const std::wregex numeroPlusTitres_rg{ L"(?:(\\d)+\\.)?(.*)" };
            std::wsmatch titles_match;
            std::regex_match(file_content[0], titles_match, numeroPlusTitres_rg);
    
            if (titles_match[1].matched)
            {
                int numeroDansFichier = std::stoi(titles_match[1]);
                if (numeroDansFichier != m_NumeroEpisode)
                {
                    std::wstring message = L"Le fichier " + nomFichier + L" contient un numéro d'épisode différent de celui dans son nom.";
                    OutputDebugStringW(message.c_str());
                }
                m_Chiffres_ou_pas = true;
            }
            else
            {
                m_Chiffres_ou_pas = false;
            }
    ...
    }
    serie.h :
    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
    struct SequenceVisionnage
    {
        SequenceVisionnage(const Episode& episode, const SequenceVisionnage& src) :
            m_episode{ episode }, m_titres{ src.m_titres }, m_streaming{ src.m_streaming },
            m_duree_en_seconde{ src.m_duree_en_seconde }, m_resume{ src.m_resume },
            m_DatesVisionnage{ src.m_DatesVisionnage }, /*m_numero{src.m_numero},*/ m_NumeroEpisode{src.m_NumeroEpisode},
            m_keyColor{ src.m_keyColor }, m_valuesColor{ src.m_valuesColor },
            m_labelMinuteSingulier{ src.m_labelMinuteSingulier }, m_labelMinutePluriel{ src.m_labelMinutePluriel }, m_espace3{ src.m_espace3 }
            , m_Chiffres_ou_pas{src.m_Chiffres_ou_pas }
        {
        };
        SequenceVisionnage(const Episode& episode, const InfosVisionnage& info_vis) :
            m_episode{ episode }, m_titres{ info_vis.m_titres }, m_streaming{ info_vis.m_streaming },
            m_duree_en_seconde{ info_vis.m_duree_en_seconde }, m_resume{ info_vis.m_resume },
            m_DatesVisionnage{ info_vis.m_DatesVisionnage }, /*m_numero{info_vis.m_numero}, */m_NumeroEpisode{info_vis.m_NumeroEpisode},
            m_keyColor{ info_vis.m_keyColor }, m_valuesColor{ info_vis.m_valuesColor }
            //, m_labelMinuteSingulier{ info_vis.m_labelMinuteSingulier }, m_labelMinutePluriel{ info_vis.m_labelMinutePluriel }
            , m_Chiffres_ou_pas{ info_vis.m_Chiffres_ou_pas }
        {
        };
    ...
        long m_NumeroEpisode{ -1 };
        bool m_Chiffres_ou_pas{ true };
    ...
    };
    serie.cpp :
    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
    void SequenceVisionnage::Print(int numero_sequence, bool hors_saison, bool chiffres_ou_pas) const
    {
        std::wstring numero_str;
        std::wstring titre_str;
        std::wstring duree_str;
    
        if (hors_saison /* && chiffres_ou_pas*/) // Je sais pas !
        {
            if(chiffres_ou_pas) // de même !
                numero_str = std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + m_valuesColor;
        }
        else
        {
            if (chiffres_ou_pas) // de même !
                numero_str = std::to_wstring(m_episode.m_saison.m_numero) + m_keyColor[1] + L'x' + m_valuesColor + ((m_episode.m_numero < 10 && m_episode.m_saison.m_nombre_episodes>10) ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + m_valuesColor;
        }
    ...
    }
    serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Episode::Print(bool hors_saison)
    {
        int numero_sequence = 1;
    
        for (const auto& sequence : m_liste_sequence_visionnages_ordonnee_chronologiquement)
        {
            //sequence.Print(numero_sequence, hors_saison);
            sequence.Print(numero_sequence, hors_saison, m_liste_sequence_visionnages_ordonnee_chronologiquement[0].m_Chiffres_ou_pas);
            numero_sequence++;
        }
    }
    Ok ou pas ! La question ? Pouvez-vous corriger ?

    ------------------------------------------
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        std::wstring m_espace1{ L" " };
        std::wstring m_espace2{ L" " };
        std::wstring m_espace3{ L" " };
    en
    std::vector<std::wstring>space {L" ", L" ", L" "} : ok ou pas ?
    ------------------------------------------

    Et :
    Matomo <===> https://www.b-lolo.fr : ok !
    Matomo <=/=> https://github.com/laurentbouleau

    Nom : Capture d’écran 2025-03-06 223936.png
Affichages : 61
Taille : 101,5 Ko
    Gratuit : Matomo
    Par contre : https://www.b-lolo.fr (WordPress : https://wordpress.com/)

    Merci

  9. #1149
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Je ne suis pas convaincu par votre ajout.

    Le nom n'est pas clair, surtout pour un booléen.
    Une variable booléenne devrait être un truc de la forme "Estxxx". Votre "Chiffres_ou_pas", c'est "EstChiffre" ou "EstPasChiffre" ?
    C'est pas clair.
    En plus, c'est encore lié à un machin d'affichage, ce qui n'a rien à foutre dans une classe métier.
    S'il y a une logique à garder cette information dans l'objet, il doit avoir un sens bien plus intrinsèque que juste 'j'affiche un truc, ou j'affiche pas un truc".
    Une information comme, "le numéro d'épisode est fiable" ou "le numéro d'épisode n'est pas fiable".
    Pourquoi ne pas stocker le numéro trouvé dans le nom du fichier ET le numéro trouvé dans le contenu du fichier ?
    Ainsi, la classe métier a les informations "nécessaires".
    C'est à l'affichage que la manière d'afficher le fait que ces 2 données ne sont pas cohérentes incombe. Mais ne polluez pas votre classe SequenceVisionnage avec des champs aux noms cryptiques.

    Et si on décortique la logique implémentée, elle n'a pas de sens "évident".
    On affiche le numéro de l'épisode quand on affiche une séquence de visionnage si :
    Le contenu du fichier est vide
    ou
    si la première ligne du fichier respecte L"(?\\d)+\\.)?(.*)"
    Donc, on affiche le numéro d'épisode même si le numéro dans le nom du fichier et celui dans la première ligne du fichier ne correspondent pas.
    C'est pas logique pour moi.
    EXPLIQUEZ EN FRANCAIS LA "LOGIQUE" DE VOTRE AFFICHAGE !!!
    Pour moi, elle n'a pas de sens.
    Et ça encore moins de sens quand, en fait, ce n'est pas dans le cadre d'une séquence de visionnage que la décision est prise, mais dans le cadre de la première séquence de visionnage de l'épisode qui est propagé à l'ensemble des séquences de cet épisode.

    C'est peut-être clair dans votre tête mais ce n'est clairement pas le cas dans le code que vous avez pondu.

    En résumé, vous complexifiez atrocement votre code pour un bidule abscons qui semble un détail "à la con".
    C'est le genre de chose qu'on fait, peut-être, mais à la toute fin du projet.

  10. #1150
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    Je ne suis pas convaincu par votre ajout.

    Le nom n'est pas clair, surtout pour un booléen.
    Une variable booléenne devrait être un truc de la forme "Estxxx". Votre "Chiffres_ou_pas", c'est "EstChiffre" ou "EstPasChiffre" ?
    ...
    En résumé, vous complexifiez atrocement votre code pour un bidule abscons qui semble un détail "à la con".
    C'est le genre de chose qu'on fait, peut-être, mais à la toute fin du projet.
    Ah !!! Ok !!! Après

    Mais :
    https://github.com/laurentbouleau/Exemple : Mars 08 (07/03/2025)

    Nom : Capture d’écran 2025-03-07 132806.png
Affichages : 58
Taille : 44,1 Ko

    ===> std::vector<std::wstring>m_spaces{ L" ", L" ", L" " };
    Comme faire ?

    Merci

  11. #1151
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Je ne suis pas convaincu par votre ajout.

    Le nom n'est pas clair, surtout pour un booléen.
    Une variable booléenne devrait être un truc de la forme "Estxxx". Votre "Chiffres_ou_pas", c'est "EstChiffre" ou "EstPasChiffre" ?
    ...
    En résumé, vous complexifiez atrocement votre code pour un bidule abscons qui semble un détail "à la con".
    C'est le genre de chose qu'on fait, peut-être, mais à la toute fin du projet.
    Ah !!! Ok !!! Après
    Vous ne voyez pas l'absurdité de la situation ?
    Vous construisez des usines à gaz sur usine à gaz jusqu'à ce que cela vous pête à la figure.
    Non, vous vous plantez complètement de priorité.
    Il faut appliquer le principe KISS : Keep It Simple and Stupid.
    Si vous ne pouvez pas correctement me justifier cette cochonnerie, dégagez-moi cette "merde", maintenant.

    std::vector<std::wstring>space {L" ", L" ", L" "} : ok ou pas ?
    Très bof.
    C'est mieux que 3 champs à la con.
    Mais le fait qu'il doit avoir 3 et uniquement 3 machins "spaces", c'est perdu car un std::vector, c'est un nombre arbitraire de valeurs.
    Comme utilisé dans le constructeur de "AffichagePersonnalisation", un "std::tuple<std::wstring, std::wstring, std::wstring>", c'est bien plus "safe" et "correct".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class AffichagePersonnalisation
    {
    public:
        AffichagePersonnalisation() {};
        /*AffichagePersonnalisation(std::tuple<std::wstring, std::wstring, std::wstring> espaces, std::pair<std::wstring, std::wstring> labelsHeure, std::pair<std::wstring, std::wstring> labelsMinute) :
            m_espace1{ std::get<0>(espaces) }, m_espace2{ std::get<1>(espaces) }, m_espace3{ std::get<2>(espaces) }, m_labelsHeure{ labelsHeure }, m_labelsMinute{ labelsMinute } {
        };*/
        AffichagePersonnalisation(std::vector<std::wstring>m_spaces, std::pair<std::wstring, std::wstring> labelsHeure, std::pair<std::wstring, std::wstring> labelsMinute);
    ...
    Vous êtes bien gentil avec cette déclaration, mais elle est où l'implémentation ?

    ===> std::vector<std::wstring>m_spaces{ L" ", L" ", L" " };
    Comme faire ?
    Commencez par enfin m'écouter, dégagez le code d'affichage des classes métiers.
    Ainsi, si votre classe "AffichagePersonnalisation" aurait un sens, ce ne serait que comme paramètre de fonctions libres en charge des affichages, donc pas de prise de gueule avec la règle des 5.

  12. #1152
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    Une information comme, "le numéro d'épisode est fiable" ou "le numéro d'épisode n'est pas fiable".
    Séries :
    https://www.allocine.fr/series/fiche.../saison-36426/
    S03E13 - La cité où tout a commencé
    Nom : Capture d’écran 2025-03-07 224452.png
Affichages : 53
Taille : 192,8 Ko
    et
    https://www3.stage.netflix.com/fr/title/70299043
    50. La cité où tout a commencé
    Nom : Capture d’écran 2025-03-07 223858.png
Affichages : 40
Taille : 833,1 Ko

    Alors, comment faire ?

  13. #1153
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Le rapport ???
    J'ai déjà signalé que le scapping de site Internet est casse-gueule et qu'il faudrait changer de source de données.
    Mais je ne vois pas le rapport entre ces pages Web et votre atavisme à mettre des noms abscons avec des concepts peu explicites.

    Alors, comment faire ?
    Comment faire quoi ?

    Vous voulez bêtement avoir le même affichage ???

    Vous avez des sources de données différentes et qui même dans une seule source peut ne pas respecter une règle quelconque.

    Implémentez vos règles et laissez les conneries marketing des autres à l'extérieur de votre projet.

  14. #1154
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 09 (08/03/2025)
    Avec : L'Attaque des Titans.[2013- Crunchyroll].Manga

    Pourquoi ne pas stocker le numéro trouvé dans le nom du fichier ET le numéro trouvé dans le contenu du fichier ?
    Ainsi, la classe métier a les informations "nécessaires".
    C'est à l'affichage que la manière d'afficher le fait que ces 2 données ne sont pas cohérentes incombe. Mais ne polluez pas votre classe SequenceVisionnage avec des champs aux noms cryptiques.

    Et si on décortique la logique implémentée, elle n'a pas de sens "évident".
    On affiche le numéro de l'épisode quand on affiche une séquence de visionnage si :
    Le contenu du fichier est vide
    ou
    si la première ligne du fichier respecte L"(?\\d)+\\.)?(.*)"
    Donc, on affiche le numéro d'épisode même si le numéro dans le nom du fichier et celui dans la première ligne du fichier ne correspondent pas.
    C'est pas logique pour moi.
    EXPLIQUEZ EN FRANCAIS LA "LOGIQUE" DE VOTRE AFFICHAGE !!!
    Pour moi, elle n'a pas de sens.
    Et ça encore moins de sens quand, en fait, ce n'est pas dans le cadre d'une séquence de visionnage que la décision est prise, mais dans le cadre de la première séquence de visionnage de l'épisode qui est propagé à l'ensemble des séquences de cet épisode.

    C'est peut-être clair dans votre tête mais ce n'est clairement pas le cas dans le code que vous avez pondu.
    Comme faire ??? Et le métier : j'en sais rien !!!

    Commencez par enfin m'écouter, dégagez le code d'affichage des classes métiers.
    ???

    Et : InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    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
        if (file_content.size() > 0)
        {
            const std::wregex numeroPlusTitres_rg{ L"(?:(\\d)+\\.)?(.*)" };
            std::wsmatch titles_match;
            std::regex_match(file_content[0], titles_match, numeroPlusTitres_rg);
     
            if (titles_match[1].matched)
            {
                //int numeroDansFichier = std::stoi(titles_match[1]);
                long numeroDansFichier = std::stoi(titles_match[1]);
                if (numeroDansFichier != m_NumeroEpisode)
                {
                    //std::wstring message = L"Le fichier " + nomFichier + L" contient un numéro d'épisode différent de celui dans son nom.";
                    //OutputDebugStringW(message.c_str());
                    m_numero = numeroDansFichier;
                }
                else
                {
                    m_numero = m_NumeroEpisode;
                }
            }
            else
            {
                m_numero = -1;
            }
    ???

    Merci

  15. #1155
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    Nom : Couche Technique et Couche Métier.png
Affichages : 44
Taille : 25,6 Ko
    Je suis crevé !!!

    Alors, comment faire ?

    Ok, vous êtes "satisfait" du résultat ?

    Si oui, il faut maintenant que vous nettoyez vos classes métier des machins qui n'ont rien à y faire, comme l'affichage.

    Commencez par ajouter la déclaration d'une fonction libre comme la ligne suivante dans "serie.h" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);

    Et les lignes suivantes dans "serie.cpp":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out)
    {
        serie.Print();
        return out;
    }
    Remplacer dans "Exemple.cpp" la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintSerieOnOutstream(serie, std::wcout);
    Après, il faudra remplacer "serie.Print()" par un code "externe" à la classe.
    Puis décommenter les "const" pour que la fonction libre est une signature "correcte".

    Et ainsi de suite avec les autres classes métier
    Merci beaucoup

  16. #1156
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 10 (09/03/2025)

    Et : L'Attaque des Titans.[2013- Crunchyroll].Manga : Mars 10 (09/03/2025)

    Ok, vous êtes "satisfait" du résultat ?

    Si oui, il faut maintenant que vous nettoyez vos classes métier des machins qui n'ont rien à y faire, comme l'affichage.
    ...
    Par:
    Ok !

    Après, il faudra remplacer "serie.Print()" par un code "externe" à la classe.
    Puis décommenter les "const" pour que la fonction libre est une signature "correcte".

    Et ainsi de suite avec les autres classes métier
    Nom : Capture d’écran 2025-03-09 221829.png
Affichages : 50
Taille : 87,2 Ko

    Alors ?

    Merci vraiment

  17. #1157
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Nom : capture-d-ecran-2025-03-09-221829.png
Affichages : 25
Taille : 87,2 Ko
    C'est pourtant clair.
    Ligne 33 de serie.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);
    Comment le compilateur sait ce que veut dire "Serie" à ce moment de l'analyse du fichier ?
    C'est ligne 40 qu'il commencerait à savoir :
    Mais c'est trop tard !!!
    Mettez cette ligne "std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);" après la ligne 377, pour que cette fonction libre reste à côté de la déclaration de la classe "Serie", mais APRES.
    Comprenez et corrigez la première erreur, etc...

    Et : L'Attaque des Titans.[2013- Crunchyroll].Manga : Mars 10 (09/03/2025)
    Vous avez créé 7 versions différentes du dépôt GitHub, juste pour ajouter et supprimer ces fichiers sans jamais chercher à comprendre et corriger le problème.
    C'est pas en mettant la tête dans le sol, comme une autruche, que vous allez corriger le problème.

    Votre programme crashe à la ligne 208 de "serie.cpp" : "m_NumeroEpisode = std::stoi(match[filename_numero_episode_index]);" dans le constructeur "InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier)" parce que la variable "match" initialisée ligne 134 de "serie.cpp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::regex_match(str, match, filename_format_rg);
    est aux fraises.

    Sachant que les lignes 136-137 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (match[filename_numero_saison_index].matched)
        m_NumeroSaison = std::stoi(match[filename_numero_saison_index]);
    Donc le cas où tout ou partie du nom du fichier ne correspond pas au format attendu est déjà pris en compte.
    Alors pourquoi croire ligne 208 que le nom du fichier contient toujours le "filename_numero_episode_index" mais pas forcément le "filename_numero_saison_index" ???
    Pourquoi ces 2 lignes sont si éloignées d'abord ? Faites des fonctions courtes et simple, pas ces usines à gaz.

    Vous vous retrouvez dans cette situation complexe parce que ligne 724 de "serie.cpp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]]{1,2})x(.)+" }))
    Pourquoi l'expression régulière ici n'est pas la même que dans le constructeur d'"InfosVisionnage" ?

    Résultat de cette incohérence, le fichier ".\L'Attaque des Titans.[2013- Crunchyroll].Manga\2013-04-06\1x02.2017.04-29.txt" passe le test de la ligne 724 mais plante l'initialisation ligne 134.
    Soit vous corrigez le nom du fichier, soit vous "corrigez" l'expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring date_year_month_day_format = L"([[:digit:]]{4})(?:-|\\.)([[:digit:]]{2})-([[:digit:]]{2})";
    (Mais, bon, c'est pas très "logique" comme format de nom de fichier)

    Nom : couche-technique-couche-metier.png
Affichages : 25
Taille : 25,6 Ko
    Ok pour ce diagramme, en début de projet, quand vous n'aviez pas des dizaines et des dizaines de champs pour customiser l'affichage de vos séries et films.
    Et la "Console", ici, ce n'est pas forcement "std::wout", pour un affichage complexe, mais une console "technique", pour du débogage, car elle n'a pas le niveau d'abstraction pour "comprendre" ce qu'est un film ou une série.

    Vous avez émis le souhait de pouvoir utiliser une interface graphique à la place d'une console et vous avez atrocement complexifié votre affichage, il faut donc séparer l'affichage du classe Film et Serie pour qu'elles restent gérables.

    std::vector<std::wstring>space {L" ", L" ", L" "} : ok ou pas ?
    Très bof.
    C'est mieux que 3 champs à la con.
    J'ai quand même dit que c'était mieux que les 3 champs à la con.
    Alors pourquoi être revenu au "3 champs à la con" ???

    S03E13 - La cité où tout a commencé
    ...
    50. La cité où tout a commencé
    ...
    J'avais interprété cela comme un format différent en fonction de la source des données : Allociné ou Netflix.
    Mais la nature de la donnée est différente.
    13, c'est le numéro de l'épisode dans la saison, 50, c'est le numéro de l'épisode dans la série.
    Renommez le champ "m_NumeroEpisode" en "m_NumeroEpisodeDansSaison" et "m_numero" en "m_NumeroEpisodeDansSerie" dans les classes qui vont bien.
    Et si le format du texte dans le fichier respect la convention "Netflix" :
    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
    ...
     if (file_content.size() > 0)
     {
         const std::wregex numeroPlusTitres_rg{ L"(?:(\\d)+\\.)?(.*)" };
         std::wsmatch titles_match;
         std::regex_match(file_content[0], titles_match, numeroPlusTitres_rg);
     
         if (titles_match[1].matched)
         {
             m_NumeroEpisodeDansSerie = std::stoi(titles_match[1]);
         }
     
         std::wstring titres = titles_match[2];
     
         trim(titres);
    ...
    }
    Nommez correctement les choses, SVP.

    Après ces modifications, vous allez vous prendre des craches dans la figure mais vous devriez être capable de voir leurs causes avec le débogueur.

  18. #1158
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    https://github.com/laurentbouleau/Exemple : Mars 11 (10/03/2025)

    L'Attaque des Titans :
    1x02.2017-04-29.txt
    et
    2x10.2024-12-13.txt
    Ok !

    Vous avez créé 7 versions différentes du dépôt GitHub, juste pour ajouter et supprimer ces fichiers sans jamais chercher à comprendre et corriger le problème.
    C'est pas en mettant la tête dans le sol, comme une autruche, que vous allez corriger le problème.
    Pourquoi ??? Pouvez-vous expliquer ?

    Et problème :
    Nom : Capture d’écran 2025-03-10 230742.png
Affichages : 24
Taille : 57,4 Ko
    J'ai oublié !!!

    Merci

  19. #1159
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 428
    Par défaut
    Pourquoi ??? Pouvez-vous expliquer ?
    C'est juste un constat, vous avez fait 7+2 versions dans GitHub, juste pour ajouter ou supprimer la totalité des fichiers du répertoire contenant les fichiers pour cette série.
    Alors que soit la modification de nom d'un seul fichier ou la "correction" d'une expression régulière aurait suffi.

    Vous avez choisi de modifier/corriger les noms de 2 fichiers, ok, mais pourquoi supprimer et ajouter tous ces fichiers ?
    Comme vous ne commentez pas vos checkin/push, c'est compliqué de comprendre ce qui a été corrigé.

    Mes remarques sur l'usage incohérent des expressions régulières reste d'actualité, même si vous n'avez pas à les "corriger/étendre".

    Et problème :
    C'est quoi le problème ?
    Les espaces dans la formulation du temps en minutes ?
    Vous avez déjà la classe "AffichagePersonnalisation" qui regroupe les informations de mise en forme de l'affichage.
    Ajouter un paramètre de ce type à la fonction "PrintSerieOnOutstream", et passer le de proche en proche jusqu'à l'endroit où ces informations sont utiles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, const AffichagePersonnalisation& perso, std::wostream& out);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, const AffichagePersonnalisation& perso, std::wostream& out)
    {
        serie.Print(perso);
        return out;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Serie::Print(const AffichagePersonnalisation& perso)
    {...}
    etc...

    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
    void SequenceVisionnage::Print(int numero_sequence, bool hors_saison, const AffichagePersonnalisation& perso) const
    {
        std::wstring numero_str;
        std::wstring titre_str;
        std::wstring duree_str;
    
        if (hors_saison)
        {
            numero_str = std::to_wstring(m_episode.m_numero) + perso.m_keyColor[1] + L" : " + perso.m_valuesColor;
        }
        else
        {
            numero_str = std::to_wstring(m_episode.m_saison.m_numero) + perso.m_keyColor[1] + L'x' + perso.m_valuesColor + ((m_episode.m_numero < 10 && m_episode.m_saison.m_nombre_episodes>10) ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + perso.m_keyColor[1] + L" : " + perso.m_valuesColor;
        }
    
        assert((m_titres.size() > 0 && m_titres[0].size() > 0) || numero_sequence > 1);
        std::vector<std::wstring> titres = m_titres;
        if (m_titres.size() == 0 || (m_titres.size() == 1 && m_titres[0].size() == 0))
        {
            titres = m_episode.m_liste_sequence_visionnages_ordonnee_chronologiquement[0].m_titres;
        }
    
        std::vector<std::wstring> titre_prefixe_list{ perso.m_keyColor[1] , perso.m_valuesColor };
        std::wstring titre_prefixe = titre_prefixe_list[0];
        unsigned int titre_prefixe_index = 0;
        for (auto& titre : titres)
        {
            titre_str += titre_prefixe_list[titre_prefixe_index] + titre;
            titre_prefixe_index = ((titre_prefixe_index + 1) % titre_prefixe_list.size());
        }
        if (titre_str.size() > 0)
            titre_str += perso.m_valuesColor;
    
        duree_str = calcul_Duree_affichage(numero_sequence,perso);
    
        std::wstring dates_str = perso.m_keyColor[1] + L" : " + perso.m_valuesColor + Print_Dates_de_visionnage();
    
        std::wstring resume_str;
    
        if (numero_sequence == 1)
        {
            resume_str += L"\r\n";
            for (auto r : m_resume)
                resume_str += r;
        }
    
        std::wcout << numero_str << titre_str << duree_str << dates_str << resume_str << L"\r\n";
    }

  20. #1160
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 783
    Par défaut
    Pardon, mais (attention) :
    Azertyuiop £££.[2024].Mini-série
    Azertyuiop £££.[2024-].Mini-série : ok !
    L'Attaque des Titans.[2013- Crunchyroll].Manga : Problème !!! Hors saison !!!

    Et :
    Nom : Capture d’écran 2025-03-11 112144.png
Affichages : 15
Taille : 7,1 Ko
    blablabla [2024- sur -]

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probléme avc la formclosing
    Par dv-2008 dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/03/2008, 16h33
  2. probléme avc console.readline()
    Par dv-2008 dans le forum VB.NET
    Réponses: 7
    Dernier message: 10/03/2008, 00h33
  3. j'ai un probléme avc un code vb.net aider moi svp
    Par dv-2008 dans le forum VB.NET
    Réponses: 12
    Dernier message: 29/01/2008, 09h20
  4. Problème avc une requête
    Par Raiga dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/06/2007, 18h36
  5. Toujours problème de lien avce la lib Cblas
    Par Kirou dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 19/06/2007, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo