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. #1121
    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
    Ok pour votre gestion de "m_valuesColor".
    (Mais vous n'avez pas besoin de ça si vous gériez l'affichage autrement.)

    Mais comme j'insiste depuis le début pour ne pas avoir le code d'affichage dans ces classes, je ne suis pas étonné par ces "difficultés".
    Pardon ???
    C'est à dire ?
    Je vous "reproche" de vouloir implémenter l'affichage des classes métier (Serie, Saison, Episode, etc...) dans ces classes plutôt que dans du code à part, depuis des mois.

    Ni ch, ni tr !!!
    Faites un effort avec les noms de variable, SVP !!!

    Ce que vous faites avec ces variables n'a aucun sens, donc, avec des noms pareils, j'y comprends rien.

    Donc, je ne vois pas ce que vous reprochez à ces variables.

    Expliquez-nous, EN FRANçAIS, comment fonctionne l'affichage d'une séquence de visionnage, SVP.

  2. #1122
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    Je vous "reproche" de vouloir implémenter l'affichage des classes métier (Serie, Saison, Episode, etc...) dans ces classes plutôt que dans du code à part, depuis des mois.
    Ok : utils.h ???

    Faites un effort avec les noms de variable, SVP !!!

    Ce que vous faites avec ces variables n'a aucun sens, donc, avec des noms pareils, j'y comprends rien.

    Donc, je ne vois pas ce que vous reprochez à ces variables.

    Expliquez-nous, EN FRANçAIS, comment fonctionne l'affichage d'une séquence de visionnage, SVP.
    Ok !

    Exemple Kaleidoscope :
    Jaune (47 min) : 03/01/2023
    Dans le quartier des diamants, Leo et sa nouvelle équipe cherchent de quoi financer un casse à plusieurs milliards : des bons au porteur gardés dans un coffre à New York.
    Jaune [bis] : 27/01/2025
    Jaune [bis] : 30/01/2025
    Vert (44 min) : 03/01/2022
    Un sombre diagnostic incite Leo à s'évader de prison avec l'aide d'un codétenu. Après d'émouvantes retrouvailles une fois dehors, il commence à préparer sa vengeance.
    Etc...

    et exemple Star Wars Rebels :
    Hors saison :
    11/08/2014 : La galaxie connaît une période sombre depuis que l'Empire galactique a étendu son emprise. (4)
    1 : La Machine dans le Ghost (4 min) : 21/08/2024
    Hera, Kanan et Chopper sont poursuivis par des TIE et doivent travailler ensemble pour tenter de leur échapper...
    1 : La Machine dans le Ghost [bis] : 22/02/2025
    2 : Attaque artisttique (4 min) : 23/08/2024
    Sabine s'introduit dans une enceinte Impériale afin de créer une diversion pour ses amis...
    Etc...

    Saison 1 :
    Cette saison commence sur Lothal avec la rencontre entre le jeune voleur, orphelin et sensible à la Force Ezra Bridger avec le groupe de rebelles de Lothal constitués de Kanan Jarrus, Hera Syndulla, Chopper, Garazed Orrelios et Sabine Wren. Ensemble, ils combattirent l'Empire Galactique et libérèrent un groupe d'esclaves Wookiees sur Kessel ; durant ce combat, Kanan dû révéler sa véritable identité de Jedi. L'Agent Alexsandr Kallus du Bureau de la Sécurité Impériale contacta alors Dark Vador qui envoya un Inquisiteur Pau'an les pourchasser.

    Par la suite, le groupe du Ghost réalisa une mission sur Garel où ils rencontrèrent R2-D2 et C-3PO, ils furent piégés sur Stygeon Prime par le Grand Inquisiteur, infiltrèrent l'académie impériale de Lothal et partirent sur l'astéroïde PM-1203 pour récupérer de l'équipement pour le mystérieux Fulcrum, indicateur pour Hera. Ezra évolua ainsi au sein de sa "nouvelle famille", notamment avec Kanan qui s'occupa de sa formation de Jedi. Durant le Jour de l'Empire, Ezra découvrit que ses parents avaient été fait prisonniers par l'Empire grâce à son ami Tsoklo qu'il sauva. Il construit par la suite son sabre laser grâce à un cristal kyber trouvé au Temple Jedi de Lothal.

    Finalement, les activités de ce groupe de rebelles gênant l'Empire, le Grand Moff Wilhuff Tarkin fut envoyé sur place pour les combattre. Il réussit, avec l'Inquisiteur et Kallus, à capturer Kanan et l'emmena dans le Système Mustafar où les rebelles de Lothal attaquèrent le vaisseau de Tarkin. Il libérèrent Kanan qui combattit et tua l'Inquisiteur, il s'enfuirent ensuite, aidés de la cellule rebelle de Fulcrum qui se révéla être Ahsoka Tano, ancienne Jedi et Padawan d'Anakin Skywalker. (15)
    1x01 : Prémices d'une Rébelle (Partie 1) (25 min) : 16/08/2024
    Un adolescent orphelin aide un groupe de rebelles.
    1x01 : Prémices d'une Rébelle (Partie 1) [bis] : 22/02/2025
    Etc...
    1x15 : Galaxie en flammes (24 min) : 28/08/2025
    L'équipage affronte de nombreux obstacles afin de libérer Kanan...

    https://github.com/laurentbouleau/Exemple : Février 10 (22/02/2025)

    Voilà !!!

  3. #1123
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    Ok ou pas ?
    Dites-moi ?

    Et :
    WordPress (https://www.b-lolo.fr/)===> Matomo : ok !
    https://github.com/laurentbouleau/ =/=> Matomo : Comment faire ?

    Merci vraiment

  4. #1124
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    https://github.com/laurentbouleau/Exemple : Février 11 (23/02/2025)

    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
    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_espace3{ src.m_espace3 }, m_labelMinuteSingulier{ src.m_labelMinuteSingulier }, m_labelMinutePluriel{ src.m_labelMinutePluriel },
            m_keyColor{ src.m_keyColor }, m_valuesColor{ src.m_valuesColor }
        {
        };
        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_espace3{ info_vis.m_espace3 }, m_labelMinuteSingulier{ info_vis.m_labelMinuteSingulier }, m_labelMinutePluriel{ info_vis.m_labelMinutePluriel }, // Pour quoi ?
            m_keyColor{ info_vis.m_keyColor }, m_valuesColor{ info_vis.m_valuesColor }
        {
        };
        boolean operator==(const SequenceVisionnage& rhs) const { return this == &rhs; };
    
        std::wstring calcul_Duree_affichage(int numero_sequence) const;
    
        void AffichagePersonnaliser(AffichagePersonnalisation perso);
    
        void Print(int numero_sequence) const;
    
        std::wstring Print_Dates_de_visionnage() const;
        long Print_Titre_chiffre(long episode) const;
    
        std::wstring m_espace1;
        std::wstring m_labelHeureSingulier;
        std::wstring m_labelHeurePluriel;
        std::wstring m_espace2;
        std::wstring m_espace3;
        std::wstring m_labelMinuteSingulier;
        std::wstring m_labelMinutePluriel;
        std::vector<std::wstring>m_keyColor;
        std::wstring m_valuesColor;
    
        std::wstring m_streaming{ L"" };
        std::vector<std::wstring> m_titres;
        long m_duree_en_seconde{ -1 };
        std::vector<std::wstring> m_resume{};
        std::vector<DateRecord> m_DatesVisionnage{};
    
        long m_NumeroEpisode{-1};
        long m_duree { -1 };
    
    private:
        const Episode& m_episode;
    };
    ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::wstring SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const
    {
        std::wstring duree_str;
        if (numero_sequence == 1)
        {
            long minutes = m_duree_en_seconde / 60;
            long secondes = m_duree_en_seconde % 60;
            duree_str += m_keyColor[1] + L" (" + m_valuesColor + std::to_wstring(minutes) + m_keyColor[1] + m_espace3 + (minutes <= 1 ? m_labelMinuteSingulier : m_labelMinutePluriel) + L')' + m_valuesColor;
        }
        return duree_str;
    }
    Ok !

  5. #1125
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    https://github.com/laurentbouleau/Exemple : Février 12 (23/02/2025)

    ok : class et struct :
    film.h, film_serie.h et serie.h : avant !!!
    Maintenant : utils.h !!!

    Voilà !!!

  6. #1126
    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
    Mes suggestions de modification de code sont basées sur la version "Février 10 (22/02/2025)" du dépôt Github.

    Expliquez-nous, EN FRANçAIS, comment fonctionne l'affichage d'une séquence de visionnage, SVP.
    Exemple Kaleidoscope :
    Jaune (47 min) : 03/01/2023
    Dans le quartier des diamants, Leo et sa nouvelle équipe cherchent de quoi financer un casse à plusieurs milliards : des bons au porteur gardés dans un coffre à New York.
    Jaune [bis] : 27/01/2025
    Jaune [bis] : 30/01/2025
    Vert (44 min) : 03/01/2022
    Un sombre diagnostic incite Leo à s'évader de prison avec l'aide d'un codétenu. Après d'émouvantes retrouvailles une fois dehors, il commence à préparer sa vengeance.
    Etc...

    et exemple Star Wars Rebels :
    Hors saison :
    11/08/2014 : La galaxie connaît une période sombre depuis que l'Empire galactique a étendu son emprise. (4)
    1 : La Machine dans le Ghost (4 min) : 21/08/2024
    Hera, Kanan et Chopper sont poursuivis par des TIE et doivent travailler ensemble pour tenter de leur échapper...
    1 : La Machine dans le Ghost [bis] : 22/02/2025
    2 : Attaque artisttique (4 min) : 23/08/2024
    Sabine s'introduit dans une enceinte Impériale afin de créer une diversion pour ses amis...
    Etc...

    Saison 1 :
    Cette saison commence sur Lothal avec la rencontre entre le jeune voleur, orphelin et sensible à la Force Ezra Bridger avec le groupe de rebelles de Lothal constitués de Kanan Jarrus, Hera Syndulla, Chopper, Garazed Orrelios et Sabine Wren. Ensemble, ils combattirent l'Empire Galactique et libérèrent un groupe d'esclaves Wookiees sur Kessel ; durant ce combat, Kanan dû révéler sa véritable identité de Jedi. L'Agent Alexsandr Kallus du Bureau de la Sécurité Impériale contacta alors Dark Vador qui envoya un Inquisiteur Pau'an les pourchasser.

    Par la suite, le groupe du Ghost réalisa une mission sur Garel où ils rencontrèrent R2-D2 et C-3PO, ils furent piégés sur Stygeon Prime par le Grand Inquisiteur, infiltrèrent l'académie impériale de Lothal et partirent sur l'astéroïde PM-1203 pour récupérer de l'équipement pour le mystérieux Fulcrum, indicateur pour Hera. Ezra évolua ainsi au sein de sa "nouvelle famille", notamment avec Kanan qui s'occupa de sa formation de Jedi. Durant le Jour de l'Empire, Ezra découvrit que ses parents avaient été fait prisonniers par l'Empire grâce à son ami Tsoklo qu'il sauva. Il construit par la suite son sabre laser grâce à un cristal kyber trouvé au Temple Jedi de Lothal.

    Finalement, les activités de ce groupe de rebelles gênant l'Empire, le Grand Moff Wilhuff Tarkin fut envoyé sur place pour les combattre. Il réussit, avec l'Inquisiteur et Kallus, à capturer Kanan et l'emmena dans le Système Mustafar où les rebelles de Lothal attaquèrent le vaisseau de Tarkin. Il libérèrent Kanan qui combattit et tua l'Inquisiteur, il s'enfuirent ensuite, aidés de la cellule rebelle de Fulcrum qui se révéla être Ahsoka Tano, ancienne Jedi et Padawan d'Anakin Skywalker. (15)
    1x01 : Prémices d'une Rébelle (Partie 1) (25 min) : 16/08/2024
    Un adolescent orphelin aide un groupe de rebelles.
    1x01 : Prémices d'une Rébelle (Partie 1) [bis] : 22/02/2025
    Etc...
    1x15 : Galaxie en flammes (24 min) : 28/08/2025
    L'équipage affronte de nombreux obstacles afin de libérer Kanan...
    Ce n'est pas une explication en français.
    On va encore se compliquer la vie parce que vous n'expliquez pas votre démarche.

    Mais cet exemple ("Star Wars Rebels") montre que le format du texte d'une "saison" pour un "Hors Saison" est très différent d'un format "Saison Classique".
    Donc pourquoi tout mettre dans une seule fonction qui doit tout prendre en compte ?
    Autant faire 2 fonctions distinctes pour avoir un code simple :
    Dans "serie.h" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Saison
    {
    public:
    ...
        void Print_Header();
        void Print_Header_Hors_Saison();
        void Print_Header_Saison();
    ...
    }
    et dans "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
    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
    void Saison::Print_Header_Hors_Saison()
    {
        std::wstring saison_str = m_keyColor[0] + L"Hors saison :" + m_valuesColor + L"\r\n";
     
        wchar_t date_tab[15];
        std::wstring date_str{};
        if (m_date_diffusee_a_partir_de.first.tm_mday == -1 && m_date_diffusee_a_partir_de.first.tm_mon == -1)
        {
            std::wcsftime(date_tab, 15, L"%Y", &m_date_diffusee_a_partir_de.first);
            std::wstring date_tab_str = date_tab;
            date_str = date_tab_str;
        }
        else if (m_date_diffusee_a_partir_de.first.tm_mday == -1)
        {
            std::wcsftime(date_tab, 15, L"%m/%Y", &m_date_diffusee_a_partir_de.first);
            std::wstring date_tab_str = date_tab;
            date_str = date_tab_str.substr(0, 2) + m_keyColor[1] + L'/' + m_valuesColor + date_tab_str.substr(3, 4);
        }
        else
        {
            std::wcsftime(date_tab, 15, L"%d/%m/%Y", &m_date_diffusee_a_partir_de.first);
            std::wstring date_tab_str = date_tab;
            date_str = date_tab_str.substr(0, 2) + m_keyColor[1] + L'/' + m_valuesColor + date_tab_str.substr(3, 2) + m_keyColor[1] + L'/' + m_valuesColor + date_tab_str.substr(6, 4);
        }
     
        std::wstring media_str;
        if (m_date_diffusee_a_partir_de.second != L"")
            media_str = m_keyColor[0] + m_date_diffusee_a_partir_de.second + m_valuesColor + L' ';
     
        std::wstring titre_str;
        if (m_titres.size() != 0)
        {
            titre_str = m_keyColor[0] + m_titres[0] + m_valuesColor;
            if (m_titres.size() > 1)
            {
                titre_str += m_keyColor[1] + m_titres[1] + m_valuesColor + m_keyColor[0] + m_titres[2] + m_valuesColor;
            }
            titre_str += m_keyColor[1] + L" : " + m_valuesColor;
        }
     
        std::wstring resume_str;
        for (auto r : m_resume)
            resume_str += ((resume_str.size()==0) ? L"" : L"\r\n") + r;
     
        std::wstring nombre_episodes_str;
        if (m_nombre_episodes >= 0)
            nombre_episodes_str = m_keyColor[1] + L" (" + m_valuesColor + std::to_wstring(m_nombre_episodes) + m_keyColor[1] + L')' + m_valuesColor;
     
        std::wcout << saison_str << date_str << media_str << m_keyColor[1] + L" : " + m_valuesColor << titre_str << resume_str << nombre_episodes_str << L"\r\n";
    }
     
    void Saison::Print_Header_Saison()
    {
        std::wstring saison_str = m_keyColor[0] + L"Saison " + m_keyColor[1] + std::to_wstring(m_numero) + m_keyColor[0] + L" :" + m_valuesColor + L"\r\n";
     
        std::wstring titre_str;
        if (m_titres.size() != 0)
        {
            titre_str = m_keyColor[0] + m_titres[0] + m_valuesColor;
            if (m_titres.size() > 1)
            {
                titre_str += m_keyColor[1] + m_titres[1] + m_valuesColor + m_keyColor[0] + m_titres[2] + m_valuesColor;
            }
            titre_str += m_keyColor[1] + L" : " + m_valuesColor;
        }
     
        std::wstring resume_str;
        for (auto r : m_resume)
            resume_str += ((resume_str.size() == 0) ? L"" : L"\r\n") + r;
     
        std::wstring nombre_episodes_str;
        if (m_nombre_episodes >= 0)
            nombre_episodes_str = m_keyColor[1] + L" (" + m_valuesColor + std::to_wstring(m_nombre_episodes) + m_keyColor[1] + L')' + m_valuesColor;
     
        std::wcout << saison_str << m_valuesColor << titre_str << resume_str << nombre_episodes_str << L"\r\n";
    }
     
    void Saison::Print_Header()
    {
        if(!m_hors_saison)
            Print_Header_Saison();
        else
            Print_Header_Hors_Saison();
     
    }
    Code largement simplifiable mais sans explications en français, on risque de faire de fausses routes.
    La présence de ce type de "fourche" de code montre qu'il faudrait 2 classes différentes ; "Saison" et "HorsSaison", pour distinguer correctement les cas.

    Cet exemple ("Star Wars Rebels") montre aussi que le format du texte des épisodes pour un "Hors Saison" est très différent d'un format "Saison Classique" qu'on pourra gérer temporairement avec un paramètre supplémentaire à la fonction "Episode:: Print" :
    Dans "serie.h" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Episode
    {
    ...
        void Print(bool hors_saison);
    ...
    }
    Dans "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
    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);
            numero_sequence++;
        }
    }
    ...
    void Saison::Print()
    {
        Print_Header();
    
        for (auto& episode : m_liste_episodes)
        {
            episode.Print(m_hors_saison);
        }
    ...
    }
    Il faut donc aussi modifier la signature de la fonction "SequenceVisionnage:: Print" pour qu'elle ait en paramètre l'information que c'est un affichage "Hors Saison" ou un affichage "Saison Classique".
    Dans "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
    26
    27
    28
    29
    30
    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 }
        {
        };
        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 }
        {
        };
        boolean operator==(const SequenceVisionnage& rhs) const { return this == &rhs; };
    
        std::wstring calcul_Duree_affichage(int numero_sequence) const;
    
        void AffichagePersonnaliser(AffichagePersonnalisation perso);
    
        void Print(int numero_sequence, bool hors_saison) const;
    
        std::wstring Print_Dates_de_visionnage() const;
        long Print_Titre_chiffre(long episode) const;//Cette fonction n'a aucun putain de sens.
    ...
    }
    Dans "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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    void SequenceVisionnage::Print(int numero_sequence, bool hors_saison) 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) + m_keyColor[1] + L" : " + m_valuesColor;
        }
        else
        {
            numero_str = std::to_wstring(m_episode.m_saison.m_numero) + m_keyColor[1] + L'x' + m_valuesColor + (m_episode.m_numero < 10 ? L"0" : L"") + std::to_wstring(m_episode.m_numero) + m_keyColor[1] + L" : " + 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{ m_keyColor[1] , 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 += m_valuesColor;
    
        duree_str = calcul_Duree_affichage(numero_sequence);
    
        std::wstring dates_str = m_keyColor[1] + L" : " + 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";
    }
    On utilise une variable "titres" pour gérer le cas où le fichier d'une séquence de visionnage ne contient pas le(s) titre(s) de l'épisode. (cf. formats de fichier MERDIQUES)
    On utilise "intelligemment" une boucle pour générer le formatage du titre.
    Et on a simplifié l'utilisation de la fonction "SequenceVisionnage::calcul_Duree_affichage"
    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
    std::wstring SequenceVisionnage::calcul_Duree_affichage(int numero_sequence) const
    {
        std::wstring duree_str;
        if (numero_sequence == 1)
        {
            long minutes = (m_duree_en_seconde/* % (60 * 60)*/) / 60;
            long secondes = m_duree_en_seconde % 60;
            duree_str += m_keyColor[1] + L" (" + m_valuesColor + std::to_wstring(minutes) + m_keyColor[1] + L" " + (minutes <= 1 ? m_labelMinuteSingulier : m_labelMinutePluriel) + L')' + m_valuesColor;
        }
        else
        {
            duree_str += L' ' + m_keyColor[1] + L'[' + m_valuesColor + L"bis" + m_keyColor[1] + L']' + m_valuesColor;
        }
        return duree_str;
    }
    J'ai remplacé "m_espace3" par un 'L" "' parce que la gestion de ces conneries de mises en forme graphique dans les classes métier commencent à me courir sur le haricot.

    "Exemple Kaleidoscope :" n'est pas vérifiable avec le code actuel dans "Exemple.cpp".
    Je vous ai déjà donné plusieurs fois les moyens de tester plusieurs cas dans une exécution.
    Vous vous obstinez avec votre bricolage. Je ne vais donc pas m'enquiquiner à faire du bricolage sur votre bricolage pour texter le résultat avec mes modifications sur cet exemple.
    Je ne ferais pas d'efforts tant que vous ne faites pas l'effort de suivre nos recommandations.

  7. #1127
    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
    Février 11 (23/02/2025)
    Ok pour les modifications, qui sont minimes.

    Février 12 (23/02/2025)
    C'est n'importe quoi.

    Vous fourrez tout dans "utils.h".
    Ça n'a aucune logique.

    Vous devez enlever des classes "Serie", "Saison", "Episode", "Film", "InfosVisionnage" et "SequenceVisionnage" tous ce qui est en relation avec de l'affichage.
    C'est des classes métier.
    Donc laissez les classes dans les anciens fichiers d'en-tête ("serie.h", etc...), c'est pas totalement correcte (on devrait avoir un fichier d'en-tête par classe), mais on va continuer avec.
    C'est le code d'affichage que vous devrait transférer des xxx.h/xxx.cpp vers utils.h/utils.cpp, pas les classes.

  8. #1128
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    https://github.com/laurentbouleau/Exemple : Février 13 (24/02/2025)

  9. #1129
    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
    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
    1
    2
    3
    4
    5
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out)
    {
        serie.Print();
        return out;
    }
    Remplacer dans "Exemple.cpp" la ligne :
    Par:
    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

  10. #1130
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    https://github.com/laurentbouleau/Exemple : Février 14 (25/02/2025)

    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" :
    Après !

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    { 
    ...
            std::wstring titres = titles_match[2];
    
            // //
            wchar_t sp = L' ';
            if (titres[0] == sp)
                titres = titres.substr(1);
            // //
    
            m_titres = extraire_Titres_Depuis_UneLigne(titres);
    ...
    }
    Ok ou pas ?

    Attention : Exemple : Zero Day.[2025 Netflix].Mini-série
    Nom : Capture d’écran 2025-02-26 135441.png
Affichages : 87
Taille : 35,7 Ko
    et :
    https://www.netflix.com/fr/title/81598435 !!!
    1x6 : 6 épisodes !!!

    Exemple : Cowboy Bebop.[2021 Netflix]
    https://www.netflix.com/fr/title/80207033
    1x01, 1x02, ..., 1x10 : 10 épisodes !!!


    Merci

  11. #1131
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    Gateway Timeout

    The gateway did not receive a timely response from the upstream server or application.
    Apache/2.4.62 (Debian) Server at www.developpez.net Port 443
    Erreur soir !!!

    https://github.com/laurentbouleau/Exemple : Février 15 (27/02/2025)

    Ni std::wostream& Serie:: PrintSerieOnOutstream(const Serie& serie, std::wostream& out)
    Ni std::wostream& PrintSerieOnOutstream(const Serie& serie, std::wostream& out)

    Pas compris !!!

    Nom : Capture d’écran 2025-02-27 005143.png
Affichages : 78
Taille : 112,1 Ko
    ???

    Et :
    Puis décommenter les "const" pour que la fonction libre est une signature "correcte".

    Et ainsi de suite avec les autres classes métier
    métier : ou qu'il est ???
    Avant, les pages : longtemps !!!

    Merci

  12. #1132
    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
    https://github.com/laurentbouleau/Exemple : Février 14 (25/02/2025)

    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" :
    Après !
    C'est toujours la même histoire.
    Vous voulez faire à votre tête en passant avoir assez de recul pour choisir les priorités, moralité, on aborde des trucs d'une effroyable complexité inutilement, car vous ne voulez pas suivre nos conseils.
    Heureusement que vous êtes opiniâtre, mais vous ne vous simplifiez pas la vie.

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    { 
    ...
            std::wstring titres = titles_match[2];
     
            // //
            wchar_t sp = L' ';
            if (titres[0] == sp)
                titres = titres.substr(1);
            // //
     
            m_titres = extraire_Titres_Depuis_UneLigne(titres);
    ...
    }
    Ok ou pas ?
    Pas trop OK, car c'est extrêmement compliqué et bavard pour ce que c'est, pas "générique/généralisable" en plus, et vous avez déjà abordé ce qu'il faut pour faire un code bien plus lisible et expressif.

    L'historique des fichiers dans GitHub montre que dans la version "Août 27", vous avez ajouté un bon nombre de fonction dans "utils.h/.cpp", en particulier la fonction "rtrim" (très mal "inséré" au demeurant car utilisation erronée du mot clé "inline").
    L'action de supprimer des "espaces" à la fin ou au début d'une chaine de caractères se nomme "Trimmer" la chaine (du verbe anglais 'to trim" : réduire, minimiser).
    En ayant déjà cette fonction dans votre base de code, cela montre que vous avez déjà eu le problème, ou un approchant, et que vous y aviez répondu avec une solution "générique".
    Regardez toutes les fois où la fonction "rtrim" est appelée dans les fonctions contenues dans le fichier "utils.cpp". (6 fois)

    Si on utilise notre ami Google avec la requête "C++ trim string", la première réponse est :
    https://stackoverflow.com/questions/...im-a-stdstring
    Ce qui donne une très bonne base à l'implémentation de toute une collection de fonctions utilitaires qu'on peut mettre directement dans "utils.h" (on a juste à changer les std::string en std::wstring et les unsigned char en wchar_t):
    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
    #include <algorithm> 
    #include <cctype>
    #include <locale>
    ...
    // trim from start (in place)
    inline void ltrim(std::wstring& s) {
        s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](wchar_t ch) {
            return !std::isspace(ch);
            }));
    }
     
    // trim from end (in place)
    inline void rtrim(std::wstring& s) {
        s.erase(std::find_if(s.rbegin(), s.rend(), [](wchar_t ch) {
            return !std::isspace(ch);
            }).base(), s.end());
    }
     
    // trim from both ends (in place)
    inline void trim(std::wstring& s) {
        rtrim(s);
        ltrim(s);
    }
     
    // trim from start (copying)
    inline std::wstring ltrim_copy(std::wstring s) {
        ltrim(s);
        return s;
    }
     
    // trim from end (copying)
    inline std::wstring rtrim_copy(std::wstring s) {
        rtrim(s);
        return s;
    }
     
    // trim from both ends (copying)
    inline std::wstring trim_copy(std::wstring s) {
        trim(s);
        return s;
    }
    Après cela, vous remplacez ce pavé illisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            wchar_t sp = L' ';
            if (titres[0] == sp)
                titres = titres.substr(1);
    En :
    (Code plus lisible et qui indique ce qu'il fait)

    Attention : Exemple : Zero Day.[2025 Netflix].Mini-série
    Pièce jointe 664898
    et :
    https://www.netflix.com/fr/title/81598435 !!!
    1x6 : 6 épisodes !!!

    Exemple : Cowboy Bebop.[2021 Netflix]
    https://www.netflix.com/fr/title/80207033
    1x01, 1x02, ..., 1x10 : 10 épisodes !!!
    Soyez plus explicite, SVP.
    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 :
    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;
    Vous devriez être capable de faire un code bien plus propre si vous avez une vue plus claire de ce que vous voulez.
    std::string et les stream/flux du C++ ont tout ce qu'il faut pour facilement faire du padding avec des 0 à gauche.

    Ni std::wostream& Serie:: PrintSerieOnOutstream(const Serie& serie, std::wostream& out)
    Ni std::wostream& PrintSerieOnOutstream(const Serie& serie, std::wostream& out)
    J'ai écrit "ajouter la déclaration d'une fonction libre", il n'y a donc aucune ambiguïté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out)
    Et elle doit être déclarée à l'extérieur de la déclaration de la classe "Serie" (et de toutes les autres classes qui devraient être ailleurs):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Serie
    {
    public:
        ...
    };
     
    std::wostream& PrintSerieOnOutstream(/*const*/ Serie& serie, std::wostream& out);
    Il faut laisser le "const" en commentaire tant que vous avez ces cochonneries de fonctions d'affichage dans cette classe. (Qui ont une const-correctness à chier, vous devriez déjà être capable de la corrigée, normalement)

    métier : ou qu'il est ???
    Le métier, c'est une couche d'abstraction.
    Classiquement, une application est découpée en couches superposées pour facilement pouvoir changer des aspects différents de l'application.
    Un découpage classique est :
    - Données
    - Métier
    - IHM (Interface Homme-Machine)
    Avec ce découpage, on peut facilement changer comment l'application s'affiche, en ne modifiant que la couche IHM.
    On peut aussi facilement changer comment les données sont stockées, en ne changeant que la couche Données.
    La couche métier est la partie du code qui n'a pas à changer si on change l'IHM ou comment les données sont stockées.

    Actuellement, dans votre code, tout est mélangé.
    Le fait que tout est mélangé fait que coder simplement est compliqué.
    La chose la plus simple à faire actuellement avec votre code, c'est de séparer la partie IHM du reste (Données + Métier).
    Quand j'indique Métier, c'est actuellement "Données + Métier".
    (La séparation entre Données et Métier peut encore attendre car la fusion des 2 ne complexifie par encore le code.)
    Donc le "Métier", c'est toutes vos classes où vous avez supprimé ce qui ne sert qu'à l'affichage.

    Avant, les pages : longtemps !!!
    ????????????

  13. #1133
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    C'est toujours la même histoire.
    Vous voulez faire à votre tête en passant avoir assez de recul pour choisir les priorités, moralité, on aborde des trucs d'une effroyable complexité inutilement, car vous ne voulez pas suivre nos conseils.
    Heureusement que vous êtes opiniâtre, mais vous ne vous simplifiez pas la vie.

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

    trim(titres);
    Ok !

    https://github.com/laurentbouleau/Exemple : Février 16 (28/02/2025)

    Merci

  14. #1134
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline void ltrim(std::wstring& s);
    inline void rtrim(std::wstring& s);
    inline void trim(std::wstring& s);
    inline std::wstring ltrim_copy(std::wstring s);
    inline std::wstring rtrim_copy(std::wstring s);
    inline std::wstring trim_copy(std::wstring s);
    Attention, vous utilisez très mal le mot clé "inline".

    Soit vous utilisez "inline" est le corps des fonctions (définition) doit être aussi dans le .h (cela indique des possibilités d'optimisation au compilateur).(comme le code que je vous ai "donné".)
    Soit vous n'utilisez pas "inline", aussi bien dans le .h que dans le .cpp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    extern inline void ltrim(std::wstring& s);
    extern inline void rtrim(std::wstring& s);
    extern inline void trim(std::wstring& s);
     
    //extern std::wostream& Serie::PrintSerieOnOutstream(const Serie& serie, std::wostream& out);
     
    extern const std::vector<std::wstring> Genre;
    extern const std::vector<std::wstring> Sur;
    extern const std::vector<std::wstring> Sous_Genre;
    extern const std::vector<std::wstring> Nationalite;
    C'est quoi ces lignes avec "extern" ???
    Dégagez-moi toutes ces lignes qui n'ont rien à foutre dans "serie.h".

    Vous devez juste ajouter un '#include "utils.h"' dans les .cpp où vous utilisez les fonctions déclarées dans "utils.h", par exemple dans serie.cpp.

  15. #1135
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    Attention, vous utilisez très mal le mot clé "inline".
    Ah bon ?

    Soit vous utilisez "inline" est le corps des fonctions (définition) doit être aussi dans le .h (cela indique des possibilités d'optimisation au compilateur).(comme le code que je vous ai "donné".)
    Rien compris !!!

    Soit vous n'utilisez pas "inline", aussi bien dans le .h que dans le .cpp.
    ???

    C'est quoi ces lignes avec "extern" ???
    Dégagez-moi toutes ces lignes qui n'ont rien à foutre dans "serie.h".

    Vous devez juste ajouter un '#include "utils.h"' dans les .cpp où vous utilisez les fonctions déclarées dans "utils.h", par exemple dans serie.cpp.
    series.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include "pch.h"
    #include "film_serie.h"
    #include "utils.h"
    ...
    Ben oui et...

    Erreur des outils Éditeur de liens LNK2019
    https://github.com/laurentbouleau/Exemple : Mars 01 (02/03/2025)

  16. #1136
    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
    Supprimez tous ces "extern" à la con.
    Utilisez correctement 'inline".

  17. #1137
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    Supprimez tous ces "extern" à la con.
    Utilisez correctement 'inline".
    https://github.com/laurentbouleau/Exemple : Mars 02 (03/03/2025)

    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
    #include "pch.h"
    #include "film_serie.h"
    #include "utils.h"
    ...
    using namespace std;
    namespace fs = std::filesystem;
    
    using DateVisionnage = DateRecord;
    ...
    // ???
    inline void ltrim(std::wstring& s);
    inline void rtrim(std::wstring& s);
    inline void trim(std::wstring& s);
    inline std::wstring ltrim_copy(std::wstring s);
    inline std::wstring rtrim_copy(std::wstring s);
    inline std::wstring trim_copy(std::wstring s);
    ...
    Rien fonctionné !!!

  18. #1138
    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
    serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    inline void ltrim(std::wstring& s);
    inline void rtrim(std::wstring& s);
    inline void trim(std::wstring& s);
    inline std::wstring ltrim_copy(std::wstring s);
    inline std::wstring rtrim_copy(std::wstring s);
    inline std::wstring trim_copy(std::wstring s);
    Cela n'a rien à foutre dans serie.cpp.

    Et dans utils.h/cpp :
    Soit vous utilisez "inline", alors vous devez tout mettre dans le .h.
    Sinon, déclaration dans le .h et définition dans le .cpp.
    Quand il y a "inline", vous devez combiné déclaration et définition dans le .h. (RTFM)

  19. #1139
    Membre très actif Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    782
    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 : 782
    Par défaut
    Cela n'a rien à foutre dans serie.cpp.
    Ok !

    Soit vous utilisez "inline", alors vous devez tout mettre dans le .h.
    Ok !

    Quand il y a "inline", vous devez combiné déclaration et définition dans le .h. (RTFM)
    RTFM : Comment fonctionne ?

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

    Merci

    Après :
    Soyez plus explicite, SVP.
    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.
    ...

  20. #1140
    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
    RTFM : Comment fonctionne ?
    RTFM : Read The Fucking Manual.

    Vous avez insisté à faire n'importe quoi (inline dans un cpp, faire des extern, etc...) au lieu de prendre un peu de temps à comprendre la documentation sur "inline". Ce n'est pas efficace.

    Maintenant, vous pouvez suivre nos conseils ?
    Pouvez-vous verbaliser vos problèmes en français, pas en "code" ?

+ 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