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. #541
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonjour Bacelar,
    J'ai oublié !!! Oui, Regex, dure à dire !!!

    The Walking Dead : https://www.allocine.fr/series/fiche.../saison-37153/ : saisons 11 !!!

    Comment faire ?
    Et Episode::Episode(fs::path const& m_cheminFichier) ?

    Merci beaucoup

  2. #542
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous ne posez toujours pas de question. C'est compliqué de répondre succinctement à vos interrogations si vous ne les exprimez pas.

    On va encore jouer au jeu des 7 différences pour voir ce qui "cloche" selon vous.

    Si on reprend les 2 premières images de votre post ici, celui avec "Moi" affiche avant le titre de l'épisode le numéro de la saison "x" le numéro de l'épisode dans la saison.

    C'est donc une différence dans l'affichage du titre de l'épisode. On est OK sur le "problème" que vous voulez "corriger" ?

    Comme votre code commence à utiliser des noms qui ont du sens, on peut aller directement au code qui semble poser problème : la fonction "Episode:: Print()"

    Dans cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode);
    if (chiffre_et_point_ou_pas)
    {
        wstr = std::to_wstring(saison);
        wstr += keyColor[1] + L'x' + valuesColor;
        wstr += std::to_wstring(episode);
        wstr += keyColor[1] + L" : " + valuesColor;
    }
    On voit que l'affichage des données qui semblent manquer dans l'image "Vous" est lié à la valeur de "chiffre_et_point_ou_pas".
    C'est le résultat de l'appel à la fonction "Episode:: Print_Titre_chiffre_et_point_ou_pas" qui se résume à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool Episode::Print_Titre_chiffre_et_point_ou_pas(unsigned char episode)
    {
        if (episode == 0)
            return false;
        return true;
    }
    Donc l'absence dans l'affichage vient du fait que le champ "episode" est égale à 0.

    Il y a donc un problème dans le constructeur de "Episode" qui n'initialise pas correctement ce champ "episode".
    Constatation vérifiée en utilisant le débugueur qui permet de valider ces hypothèses.

    Le constructeur est la fonction "Episode:: Episode(fs::path const& m_cheminFichier)".

    Supprimez-moi ce putain de "m_" du nom de l'argument de la fonction, "m_" c'est pour indiquer un membre (généralement un champ) d'une classe, ici ce n'est pas (encore) un membre de la classe mais juste un paramètre de la fonction.
    Le champ "std::filesystem::path m_cheminFichier;" que vous avez spécifié dans le .h n'est jamais initialisé.
    Et avec votre nom de paramètre (à la con), cela donnerait comme code d'initialisation du champ m_cheminFichier dans le constructeur ; un code de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.m_cheminFichier = m_cheminFichier;
    C'est clairement illisible et on utilise un hack (mettre "this." devant) pour que le code fonctionne.
    Alors que si le paramètre se nommerait "cheminFichier" (comme dans sa déclaration dans le .h), le code d'initialisation du champ serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_cheminFichier = cheminFichier;
    Quand même bien moins casse-gueule, non ?


    Le numéro de l'épisode est dans le nom du fichier dont le chemin est passé en paramètre du constructeur (que je nommerai par la suite "cheminFichier" et pas "m_cheminFichier", parce que "m_cheminFichier" c'est un nom bien trop merdique).

    Quand cheminFichier est égale à "./House of Ninjas.[2024 Netflix].Mini-série\2024-02-15\1x1.2024-02-17.txt", le numéro de l'épisode est la partie coloriée en rouge.
    Si vous regardez un peu plus attentivement comment fonctionne l'expression régulière, vous verrez que cette partie du chemin est dans la variable "match[filename_numero_episode_index]".
    Variable qui est utilisé à a ligne 510 de "serie.cpp" pour initialiser la variable poétiquement nommée "fucking_e", en l'honneur de vos noms de variables si mal choisies.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fucking_e = std::stoi(match[filename_numero_episode_index]);
    Comme vous ne vous servez plus de fucking_e, vous devriez utiliser, à la place, un code de la forme :
    episode = std::stoi(match[filename_numero_episode_index]);
    Il faudrait juste changer le type de champ "episode" pour qu'il soit logiquement un nombre et pas un "unsigned char".
    Je ne comprends pas la logique de faire du champ "episode" un "unsigned char", ça va être bien le bordel quand il y aura plus de 9 épisodes par saisons.

    Mais il semble que le code qui sert à initialiser le champ "episode" n'utilise pas le nom du fichier mais son contenu. (pourquoi faire simple ?)

    Ligne 522 à 531 de éserie.cpp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    pos = t[0].find(L". ");
    if (pos == std::wstring::npos || t[0][3] == L'.')
    {
        //saison = 0;
        episode = 0;
    }
    else
    {
        unsigned int x = std::stoi(t[0], &pos);
        t[0] = t[0].substr(pos + 2);
    }
    Donc, si la première ligne du fichier ne respecte pas le format attendu, on met '0' dans le champ "episode". (Ça sert à rien car c'est déjà la valeur par défaut).
    Mais si ma première ligne du fichier respect le format attendu, on met dans la variable locale "x", la valeur du numéro de l'épisode.
    On met ce numéro d'épisode qui est dans la variable locale "x" dans le champ "episode" de l'objet à quel moment ? (bin, jamais)
    En remplaçant la ligne 530 par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    episode = std::stoi(t[0])
    et en changeant le type du champ episode pour que cela compile, vous aurez votre champ "episode" correctement initialisé et donc un affichage "correct".

    Vous avez pris la bonne initiative d'ajouter au constructeur le code qui initialise les données de l'objet Episode à partir du contenu du fichier.

    Mais vous continuez d'utiliser ces usines à gaz à base de find, pos et autres booléen foundx.
    Je pense que le format du contenu du fichier n'est pas très complexe et qu'une expression régulière d'une forme proche de :
    "(([[:digit:]]+)\\.\\s)?(.+)((\\s?(\\-|\\\\s|/)(.+))?"
    Devrait permettre de récupérer le titre et le sous-titre bien plus facilement et de manière bien plus fiable.
    (Il y a peut-être à gérer l'aspect "non greedy" du titre à corriger)

    Et le code de la fonction "afficher_Temps", qui est appelé par le constructeur est aussi une usine à gaz simplifiable avec quelques expressions régulière, et c'est encore un putain de nom de fonction qui n'a rien à voir avec ce qu'elle fait réellement.

    D'accord : Problème !!!
    On est d'accord, il y a problème, mais c'est dans le code que vous avez ajouté (=> usine à gaz).

    Moyennement !!!
    C'est à dire ?

    Les expressions régulières, c'est un gros morceau, si vous ne comprenez pas tout, c'est tout à fait normal.

    Je ne comprends pas vos références aux pages d'Allociné.

    The Walking Dead : https://www.allocine.fr/series/fiche.../saison-37153/ : saisons 11 !!!
    Quelle est la question ?

    Comment faire ?
    Et Episode::Episode(fs::path const& m_cheminFichier) ?
    Comment faire quoi ?
    J'ai déjà montré ci-dessus que le code ajouté (usine à gaz) est bogué.

  3. #543
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonjour bacelar,

    Pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    void Saison::afficher_Fichier(fs::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.filename().wstring();
        std::wcout << nomFichier << std::endl;
        auto nomImage = cheminFichier.extension().wstring();
        std::wcout << L'{' << nomImage << L'}' << std::endl;
        if (nomImage == L".jgp")
        {
            std::wcout << nomFichier << std::endl;
            ::afficher_Image(cheminFichier, image);
            return;
        }
        if (nomImage == L".txt")
        {
            if (nomFichier == L"_you_.txt")
            {
                return;
            }
            if (!(std::isdigit(nomFichier[0])))
            {
                // Avec
                if (nomFichier == L"Avec.txt")
                {
                    ::afficher_Avec(cheminFichier, avec);
                    return;
                }
                // Chaîne d'origine -
                if (nomFichier == L"Chaîne d'origine.txt")
                {
                    //afficher_Chaine(filename, nomFichier, d_chaine[I]);
                    return;
                }
                // DVD
                if (nomFichier == L"DVD.txt")
                {
                    //D_DVD[I] = true;
                    return;
                }
                // Netflix
                if (nomFichier == L"Netflix.txt")
                {
                    afficher_Netflix(cheminFichier);
                    return;
                }
                // Note
                if (nomFichier == L"Note.txt")
                {
                    afficher_Note(cheminFichier);
                    return;
                }
                // Titre
                if (nomFichier == L"Titre.txt")
                {
                    afficher_Titre(cheminFichier);
                    return;
                }
            }
            //
            if (
                (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9')
                && nomFichier[1] == L'x'
                )
            {
                Creer_Episode(cheminFichier);
                return;
            }
            if (
                (nomFichier[0] == L'1' || nomFichier[0] == L'2' || nomFichier[0] == L'3' || nomFichier[0] == L'4' || nomFichier[0] == L'5' || nomFichier[0] == L'6' || nomFichier[0] == L'7' || nomFichier[0] == L'8' || nomFichier[0] == L'9')
                && (std::isdigit(nomFichier[1]))
                && nomFichier[2] == L'x'
                )
            {
                Creer_Episode(cheminFichier);
                return;
            }
            if (int j = std::stoi(nomFichier))
            {
                afficher(cheminFichier);
                return;
            }
            // Erreur !
            if (nomFichier != L"")
            {
                //E.afficher_X(-1, nomFichier, L'{' + t + L".txt} !!!");
                return;// EXIT_FAILURE;
            }
        }
        else if (nomImage == L".jgp")
            // Image
        {
            std::wcout << nomFichier << std::endl;
            afficher_Image(cheminFichier, image);
            return;
        }
        else if(nomImage == L".jgp" || nomImage == L".png" || nomImage == L".webp")
            // Image
        {
            std::wcout << nomFichier << std::endl;
            afficher_Image(cheminFichier, image);
            return;
        }
        else
        {
        }
        return;
     }
    ".webp" : ok !
    mais : ".jgp" ?

    La question ?

    Merci beaucoup

  4. #544
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Le code que vous postez ne correspond pas à celui dans Github (la 2ème version "Mars 04", faites en sorte que vos tags Github soient unique BORDEL).

    Mais bon, il y a plus de connerie dans celui que vous postez que dans celui du dépôt Github.

    Donc on passe sur ces putain de "std::wcout << ..." à la con, que je vous indique de ne pas utiliser depuis des mois et d'utiliser le débogueur interactif à la place.
    Ils ne sont pas dans la version Github, et tant mieux.

    Vous testez pas moins de 3 fois la valeur de "nomImage" (encore un nom à la con, préférez "extImage" car ce n'est que l'extension du fichier qui est contenu dans cette variable) à la valeur ".jgp".
    Et les 3 fois avec une faute "d'orthographe".
    L'extension du fichier attendue, c'est pas ".jgp", mais ".jpg".
    Le code dans Github n'a qu'une fois l'erreur.

    Donc prenez la version sous Github et changer ".jgp" par ".jpg". (et je vous ai pas dit de ne pas utiliser des valeurs en dur dans le code, pour ne pas à regarder partout dans le code quand on fait une erreur de typo à la con que celle-ci ?)

  5. #545
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Je suis vraiment désolé (".jgp" par ".jpg") ! Mais, bon

    https://github.com/laurentbouleau/Exemple : Mars 05

    Les problèmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct Episode
    {
    ...
        unsigned short int saison{};
        unsigned short int episode{};
        std::vector<DateRecord> dr;
        std::wstring streaming;
        bool b { false };
        std::wstring titre;
        std::wstring deux_points;
        std::wstring sous_titre;
        std::tm tm{ 0 };
        std::wstring phrases;
    ...
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Episode::Episode(fs::path const& cheminFichier)
    {
    ...
        std::vector<DateRecord> drS;
        std::wstring streaming = L"";
    ...
        while (std::regex_search(dates_str, dates_match, std::wregex{ dates_format }))
        {
            if (dates_match[dates_date_year_month_day_year_index].matched)
            {
                auto year = std::stoi(dates_match[dates_date_year_month_day_year_index]);
                auto month = std::stoi(dates_match[dates_date_year_month_day_month_index]);
                auto day = std::stoi(dates_match[dates_date_year_month_day_day_index]);
    
                assert(checkyear(year));
                assert(checkmonth(month));
                assert(checkday(month, day, year));
    
                DateRecord dr{ {0,0,0,day,month - 1,year - 1900} };
    
                drS.emplace_back(dr);
            }
    ...
    }
    Pas compris !!!

    Aussi problème !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dr)
    {
        if (affichage_Date_ou_dates && dr.size() > 0)
        //    std::tm date{ 0 };
        //    bool someFlag{ false };
        {
            wchar_t date_string[15];
            std::wstring wstr = L"";
            if (dr.size() == 1)
            {
                wcsftime(date_string, 15, L"%d/%m/%Y", &dr[0].date);
                wstr = date_string;
                wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4);
                if (streaming != L"")
                    wstr += keyColor[1] + L" : " + valuesColor + streaming;
                if (dr[0].someFlag)
                    wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
    
                return wstr;
            }
        }
        return L"";
    }
    dr.size() == 1 ???

    Merci beaucoup

  6. #546
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Nom : Capture d’écran 2024-03-11 221016.png
Affichages : 133
Taille : 58,1 Ko

  7. #547
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Pas compris !!!
    Le nommage, bordel.

    Votre champ "dr", c'est pour "DateRecord", je suppose ; mais c'est un "std::vector<DateRecord>", pas un simple "DateRecord".
    Donc faut au moins que ça se voit dans le nom du champ que ce n'est pas un simple "DateRecord" mais plusieurs.

    Donc j'ai créé une variable locale qui fait le minimum du minimum pour montrer qu'il y a plusieurs DateRecord, en l'appelant "drS".
    C'est vraiment un minimum, distinguer les variables mono-valuées des variables multi-valuées.
    Mais ça serait mieux de les nommer en fonction de leurs usages/utilitées plutôt qu'un truc qui correspond à un type "générique".
    Par example, "dates_de_diffusion" c'est plus clair que "drS" et encore plus que "dr".

    Donc FAITES GAFFE A VOS PUTAINS DE NOMS !!!

    Donc remplacer l'utilisation de la variable locale par un champ, mais avec un nom "correct".
    Si j'avais utilisé votre "dr", le code aurait été illisible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateRecord dr{ {0,0,0,day,month - 1,year - 1900} };
    C'est la manière habituelle de créer un objet/structure avec les champs initialisés, car vous n'avez pas pris la peine de définir un constructeur de "DateRecord".
    Toujours initialiser correctement un objet dès sa création.
    https://medium.com/pranayaggarwal25/...ns-c11e931c3ba

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct DateRecord
    {
        std::tm date{ 0 };
        bool someFlag{ false };
    };
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {0,0,0,day,month - 1,year - 1900}
    sert à initialiser les champs {tm_sec, tm_min, tm_hour, tm_mday, tm_mon, tm_year} du champ "date" de la structure "dr" de type "DateRecord.

    cf.:https://en.cppreference.com/w/cpp/chrono/c/tm

    Pourquoi ces "-1" et autres "-1900" qui se baladent : regardez dans la documentation le format des champs comme tm_year : years since 1900 (nombres d'années depuis 1900), oui c'est un format bien pourri ou "0" ça veut dire "1900".

    dr.size() == 1 ???
    Bin ça, c'est votre code, je sais pas pourquoi vous le fait comme ça et que vous truffez votre code de "dr[0]" complètement foireux.

    Reprenez le code de votre fonction pour qu'il gère que l'argument "std::vector<DateRecord>& dr" soit multi-valuées.

    Tient-tient on reboucle sur le fait de mal nommer les arguments, ça fait du code "débile" dans la fonction.

    Vous connaissez la chanson maintenant "NOMMEZ CORRECTEMENT VOS VARIABLES/CHAMPS/ARGUMENTS, BORDEL !!!".

    Et bien jouer pour la copie d'écran qui montre que vous commencez à vous servir du débugueur.

  8. #548
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Je ne sais plus le faire ! J'ai du mal a lire et écrire !
    Mais, bon : tant pis !

    https://github.com/laurentbouleau/Exemple : Mars 06

    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
        if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0)
        //    std::tm date{ 0 };
        //    bool someFlag{ false };
        {
            std::wstring wstr = L"";
            if (dates_de_diffusion.size() == 1)
            {
                std::time_t t = std::mktime(&dates_de_diffusion[0].date);
                std::tm local = *std::localtime(&t);
                std::wcout << "local: " << std::put_time(&local, L"%d/%m/%Y") << '\n';
                //wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4);
                // Ici :
                wstr = std::put_time(&local, L"%d/%m/%Y");
     
                if (streaming != L"")
                    wstr += keyColor[1] + L" : " + valuesColor + streaming;
                if (dates_de_diffusion[0].someFlag)
                    wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
     
                return wstr;
            }
        }
    ...
    Nom : Capture d’écran 2024-03-13 214659.png
Affichages : 154
Taille : 61,7 Ko

    Je suis crevé ! Je m'arrive pas ! J'en ai marre !!!

    Merci

  9. #549
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Mars 07

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void Episode::afficher_temps_min(std::wstring& m)
    {
        assert(m.length() > 0 && L"Nom de temps min et vide");
        int temps = 0;
        std::size_t pos = 0;
        temps = std::stoi(m, &pos);
        assert((temps != 0 ) && L"Pas de temps !!!");
        if(temps < 60)
            tm.tm_min = temps;
        else
        {
            tm.tm_hour = temps / 60;
            tm.tm_min = temps % 60;
        }
        m = m.substr(pos);
        assert(!(m[0] != L' ' && m[0] != L'm' && m[0] != L'M') && L"Pas d'escapace ou min, Min ou MIN !!!");
     
        if (m[0] == L' ')
            m = m.substr(1);
        if (std::find(::min.begin(), ::min.end(), m) != ::min.end())
            ;
        else
        {
            assert((m[1] == L' ') && "Attention min non valide ou non incompris !!!");
        }
     
        return;
    }
    Problème ou pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void Episode::Print()
    {
        if (affichage_Print_actif)
        {
            std::wstring wstr;
            bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode);
            if (chiffre_et_point_ou_pas)
            {
                wstr = std::to_wstring(saison);
                wstr += keyColor[1] + L'x' + valuesColor;
                wstr += std::to_wstring(episode);
                wstr += keyColor[1] + L" : " + valuesColor;
            }
            wstr += keyColor[1] + titre + valuesColor;
            if (deux_points != L"")
                wstr += deux_points + keyColor[1] + sous_titre + valuesColor;
            if(tm.tm_hour == 0)
                wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(tm.tm_min) + keyColor[1]+ min + L')' + valuesColor;
            else
            {
                int temps = tm.tm_hour * 60 + tm.tm_min % 60;
                wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(temps) + keyColor[1] + min + L')' + valuesColor;
            }
            wstr += keyColor[1] + L" : " + valuesColor + Print_Date_ou_Dates(dates_de_diffusion);
            std::wcout << wstr << std::endl;
            // phrases
            if (titre != L"")
                std::wcout << phrases << std::endl;
            else
                ;
     
        }
    }
    Presque !!!

    Hier, pas compris !!!
    https://en.cppreference.com/w/cpp/chrono
    et
    https://en.cppreference.com/w/cpp/chrono/c/tm
    etc... ben non !!! Alors...

    Ici : wstr ??? std::put_time(&local, L"%d/%m/%Y");

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
        if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0)
        //    std::tm date{ 0 };
        //    bool someFlag{ false };
        {
            std::wstring wstr = L"";
            if (dates_de_diffusion.size() > 0)
            {
    //            std::time_t t = std::mktime(&dates_de_diffusion[0].date);
    //            std::tm local = *std::localtime(&t);
    //            std::wcout << "local: " << std::put_time(&local, L"%d/%m/%Y") << '\n';
                //wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4);
                // Ici :
                //wstr = std::put_time(&local, L"%d/%m/%Y");
     
                if (streaming != L"")
                    wstr += keyColor[1] + L" : " + valuesColor + streaming;
                if (dates_de_diffusion[0].someFlag)
                    wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
     
                return wstr;
            }
        }
    ...
    Compliqué à dire !!!

    Merci d'avance

  10. #550
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Citation Envoyé par Laurent_B_ Voir le message
    Bonsoir,

    Je ne sais plus le faire ! J'ai du mal a lire et écrire !
    Mais, bon : tant pis !

    https://github.com/laurentbouleau/Exemple : Mars 06

    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
        if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0)
        //    std::tm date{ 0 };
        //    bool someFlag{ false };
        {
            std::wstring wstr = L"";
            if (dates_de_diffusion.size() == 1)
            {
                std::time_t t = std::mktime(&dates_de_diffusion[0].date);
                std::tm local = *std::localtime(&t);
                std::wcout << "local: " << std::put_time(&local, L"%d/%m/%Y") << '\n';
                //wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4);
                // Ici :
                wstr = std::put_time(&local, L"%d/%m/%Y");
     
                if (streaming != L"")
                    wstr += keyColor[1] + L" : " + valuesColor + streaming;
                if (dates_de_diffusion[0].someFlag)
                    wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
     
                return wstr;
            }
        }
    ...
    Nom : Capture d’écran 2024-03-13 214659.png
Affichages : 154
Taille : 61,7 Ko

    Je suis crevé ! Je m'arrive pas ! J'en ai marre !!!

    Merci
    "std::put_time", c'est un peu mal foutu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    #include <sstream>
    ...
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
    ....
                std::wstringstream target_stream;
                target_stream << std::put_time(&local, L"%d/%m/%Y");
                wstr = target_stream.str();
    ...
    }
    ...

  11. #551
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Citation Envoyé par Laurent_B_ Voir le message
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Mars 07

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void Episode::afficher_temps_min(std::wstring& m)
    {
        assert(m.length() > 0 && L"Nom de temps min et vide");
        int temps = 0;
        std::size_t pos = 0;
        temps = std::stoi(m, &pos);
        assert((temps != 0 ) && L"Pas de temps !!!");
        if(temps < 60)
            tm.tm_min = temps;
        else
        {
            tm.tm_hour = temps / 60;
            tm.tm_min = temps % 60;
        }
        m = m.substr(pos);
        assert(!(m[0] != L' ' && m[0] != L'm' && m[0] != L'M') && L"Pas d'escapace ou min, Min ou MIN !!!");
     
        if (m[0] == L' ')
            m = m.substr(1);
        if (std::find(::min.begin(), ::min.end(), m) != ::min.end())
            ;
        else
        {
            assert((m[1] == L' ') && "Attention min non valide ou non incompris !!!");
        }
     
        return;
    }
    Problème ou pas ?
    Je veux mon neveu qu'il y a pas mal de problème.

    Déjà, le nommage, c'est n'importe quoi comme d'habitude.

    "Episode::afficher_temps_min" fait tellement pas ce qu'indique son nom que j'ai utilisé la fonctionnalité de Visual Studio pour la renommé "Episode::afficher_temps_min_monCul".

    Elle fait plein de choses différentes mais clairement pas "afficher" un temps en "min(nute)".

    Ce code montre aussi une grosse erreur qu'il faut rapidement corriger, l'utilisation d'un mauvais type de données.
    C'est le genre d'erreur à supprimer instantanément.

    Ici, vous utilisez un champ "tm" (encore un nom A LA CON!!!) de type "std::tm" pour stocker une durée.
    https://en.cppreference.com/w/cpp/chrono/c/tm
    C'est fait pour stocker une DATE pas une durée.
    C'est tellement pas une durée que le code que fourni ChatGPT à la question :
    "Comment remplir un std::tm à partir d'un nombre de minute ?"
    Est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <iostream>
    #include <ctime>
     
    // Remplit un objet std::tm à partir d'un nombre de minutes
    std::tm fill_tm_from_minutes(long long minutes) {
        std::tm time = {}; // Initialise avec les valeurs par défaut
        long long remaining_minutes = minutes;
     
        // Calcul des années
        time.tm_year = static_cast<int>(remaining_minutes / (60 * 24 * 365));
        remaining_minutes %= (60 * 24 * 365);
     
        // Calcul des jours dans l'année
        time.tm_yday = static_cast<int>(remaining_minutes / (60 * 24));
        remaining_minutes %= (60 * 24);
     
        // Calcul des heures
        time.tm_hour = static_cast<int>(remaining_minutes / 60);
        remaining_minutes %= 60;
     
        // Minutes restantes
        time.tm_min = static_cast<int>(remaining_minutes);
     
        // Conversion de l'année en années depuis 1900
        time.tm_year += 1900;
     
        // Conversion du jour de l'année en mois et jour du mois
        int month = 0;
        while (time.tm_yday >= 0) {
            int days_in_month = 0;
            switch (month) {
                case 0: case 2: case 4: case 6: case 7: case 9: case 11:
                    days_in_month = 31;
                    break;
                case 3: case 5: case 8: case 10:
                    days_in_month = 30;
                    break;
                case 1:
                    if ((time.tm_year % 4 == 0 && time.tm_year % 100 != 0) || time.tm_year % 400 == 0)
                        days_in_month = 29; // Leap year
                    else
                        days_in_month = 28;
                    break;
            }
            if (time.tm_yday >= days_in_month) {
                time.tm_yday -= days_in_month;
                month++;
            } else {
                break;
            }
        }
        time.tm_mon = month;
        time.tm_mday = time.tm_yday + 1;
     
        return time;
    }
     
    int main() {
        long long minutes = 123456789; // Exemple de nombre de minutes
     
        // Remplir un objet std::tm à partir du nombre de minutes
        std::tm time = fill_tm_from_minutes(minutes);
     
        // Afficher le résultat
        std::cout << "Year: " << time.tm_year << std::endl;
        std::cout << "Month: " << time.tm_mon << std::endl;
        std::cout << "Day: " << time.tm_mday << std::endl;
        std::cout << "Hour: " << time.tm_hour << std::endl;
        std::cout << "Minute: " << time.tm_min << std::endl;
     
        return 0;
    }
    Je vous laisse apprécier la bonne grosse boulette "time.tm_year += 1900;" à la place de "time.tm_year -= 1900;".
    Mais on voit que std::tm c'est n'importe quoi, parce qu'on se fout des années bisextiles ou des passages des heures d'été et d'hiver pour une durée.
    Dans un premier temps, on peut stocker la durée sous forme d'un simple entier pour indiquer le nombre de secondes (si on fait l'assertion que la résolution de la durée est à la seconde).
    Dans l'audio-visuelle "sérieuse", on a plutôt tendance à utilisé des "frames" et pas des secondes.
    Donc à la place de cette cochonnerie dans serie.h
    Utilisez plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long duree_en_seconde{ -1 };
    Après, dans le corps de la fonction elle-même, vous confondez toujours l'usage d'"assert" et le lancement d'une exception.
    Les asserts se déclenchent quand le contenu d'une fichier (l'argument de la fonction est le contenu d'une ligne dans un fichier), et non lors de la détection d'une erreur de programmation.
    Ce n'est donc pas des asserts qu'il faut utiliser mais lancer une exception avec un type et des informations qui permettrait aux codes appelants de corriger le tir.

    Le code est encore une usine à gaz qu'une simple expression régulière rendrait plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Episode::afficher_temps_min_monCul(std::wstring& m)
    {
        const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)" };
     
        std::wsmatch match;
     
        if (std::regex_match(m, match, duree_format_rg))
        {
            auto duree_en_minute = std::stoi(match[1]);
            duree_en_seconde = duree_en_minute * 60;
        }
        else
        {
            throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide.");
        }
    }
    Et vous pourrez renommer "Episode::afficher_temps_min_monCul" en "Episode::initialiser_duree" par exemple.


    Citation Envoyé par Laurent_B_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void Episode::Print()
    {
        if (affichage_Print_actif)
        {
            std::wstring wstr;
            bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode);
            if (chiffre_et_point_ou_pas)
            {
                wstr = std::to_wstring(saison);
                wstr += keyColor[1] + L'x' + valuesColor;
                wstr += std::to_wstring(episode);
                wstr += keyColor[1] + L" : " + valuesColor;
            }
            wstr += keyColor[1] + titre + valuesColor;
            if (deux_points != L"")
                wstr += deux_points + keyColor[1] + sous_titre + valuesColor;
            if(tm.tm_hour == 0)
                wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(tm.tm_min) + keyColor[1]+ min + L')' + valuesColor;
            else
            {
                int temps = tm.tm_hour * 60 + tm.tm_min % 60;
                wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(temps) + keyColor[1] + min + L')' + valuesColor;
            }
            wstr += keyColor[1] + L" : " + valuesColor + Print_Date_ou_Dates(dates_de_diffusion);
            std::wcout << wstr << std::endl;
            // phrases
            if (titre != L"")
                std::wcout << phrases << std::endl;
            else
                ;
     
        }
    }
    Presque !!!

    Hier, pas compris !!!
    https://en.cppreference.com/w/cpp/chrono
    et
    https://en.cppreference.com/w/cpp/chrono/c/tm
    etc... ben non !!! Alors...
    Comme déjà indiqué std::tm est un type de données qui n'a rien à faire avec des durées.

    Citation Envoyé par Laurent_B_ Voir le message
    Ici : wstr ??? std::put_time(&local, L"%d/%m/%Y");
    Déjà répondu avant mais std::tm est un type inapproprié à l'usage que vous voulez en faire.

    Citation Envoyé par Laurent_B_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
        if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0)
        //    std::tm date{ 0 };
        //    bool someFlag{ false };
        {
            std::wstring wstr = L"";
            if (dates_de_diffusion.size() > 0)
            {
    //            std::time_t t = std::mktime(&dates_de_diffusion[0].date);
    //            std::tm local = *std::localtime(&t);
    //            std::wcout << "local: " << std::put_time(&local, L"%d/%m/%Y") << '\n';
                //wstr = wstr.substr(0, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(3, 2) + keyColor[1] + L'/' + valuesColor + wstr.substr(6, 4);
                // Ici :
                //wstr = std::put_time(&local, L"%d/%m/%Y");
     
                if (streaming != L"")
                    wstr += keyColor[1] + L" : " + valuesColor + streaming;
                if (dates_de_diffusion[0].someFlag)
                    wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
     
                return wstr;
            }
        }
    ...
    Compliqué à dire !!!

    Merci d'avance
    Quelle est la question ?

  12. #552
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    Moi : Alzheimer : Oui ou non ?

    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Episode::afficher_temps_min_monCul
    Tu parles !!!

    Merci d'avance

  13. #553
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Et vous pourrez renommer "Episode::afficher_temps_min_monCul" en "Episode::initialiser_duree" par exemple.
    (BIS)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Episode::initialiser_duree(std::wstring& m)
    {
        const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)" };
     
        std::wsmatch match;
     
        if (std::regex_match(m, match, duree_format_rg))
        {
            auto duree_en_minute = std::stoi(match[1]);
            duree_en_seconde = duree_en_minute * 60;
        }
        else
        {
            throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide.");
        }
    }

  14. #554
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Un problème particulier, ou vous en avez marre de mes réponses "désobligeantes" ?

  15. #555
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Je suis désolé ! Mais, monCul : j'aime pas !!!
    Ok ? Merci

    Voici :
    https://github.com/laurentbouleau/Exemple : Mars 08

    Problème : pas si ni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
        if (affichage_Date_ou_dates && dates_de_diffusion.size() > 0)
        //    std::tm date{ 0 };
        //    bool someFlag{ false };
        {
            std::wstring date_ou_dates_wstr = L"";
            if (dates_de_diffusion.size() > 0)
            {
                std::vector<std::wstring> v_wstr;
                for (auto i = 0; i < dates_de_diffusion.size(); i++)
                {
                    std::time_t t = std::mktime(&dates_de_diffusion[i].date);
                    std::tm local = *std::localtime(&t);
                    std::wstringstream target_stream;
                    target_stream << std::put_time(&local, L"%d/%m/%Y");
                    std::wstring date = target_stream.str();
                    //date = date.substr(0, 2) + L'/' + date.substr(3, 2) + L'/' + date.substr(6, 4);
                    //date = date.substr(0, 2) + keyColor[1] + L'/' + valuesColor + date.substr(3, 2) + keyColor[1] + L'/' + valuesColor + date.substr(6, 4);
                    v_wstr.push_back(date);
                    date = L"";
                    target_stream.str() = L"";
                }
                if (v_wstr.size() == 1)
                {
                    date_ou_dates_wstr = v_wstr[0].substr(0, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(3, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(6, 4);
                    if(dates_de_diffusion[0].someFlag)
                        date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
                if (streaming != L"")
                    date_ou_dates_wstr += keyColor[1] + L" : " + valuesColor + streaming;
                    return date_ou_dates_wstr;
                }
                //system("PAUSE");
                std::wstring date2 = v_wstr[0];
                int j = 1;
                for (size_t i = 0; i < v_wstr.size(); i++)
                {
                    if (i > 0 && date2 == v_wstr[i])
                    {
                        if (v_wstr[i - 1] == v_wstr[i])
                        {
                            v_wstr[i - 1] += L"(1)";
                            v_wstr[i] = L"(2)";
                            j += 2;
                        }
                        else
                        {
                            v_wstr[i] = L'(' + std::to_wstring(j) + L')';
                            j++;
                        }
                    }
                    else
                    {
                        j = 1;
                        date2 = v_wstr[i];
                    }
                }
                bool first = true;
                for (auto i = 0; i < v_wstr.size(); i++)
                    //for (auto& v : v_wstr)
                {
                    if (!first && v_wstr[i][0] != L'(')
                        date_ou_dates_wstr += L", ";
                    date_ou_dates_wstr += v_wstr[i];
                    first = false;
                }
     
                //bool last = false;
                if (dates_de_diffusion.back().someFlag)
                {
                    std::wcout << L"aaaa";
                    date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel" + keyColor[1] + L')' + valuesColor;
                }
                size_t pos;
                if (pos = date_ou_dates_wstr.find(L" et "))
                    date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L" et ", keyColor[1] + L" et " + valuesColor);
                if (pos = date_ou_dates_wstr.find(L")("))
                    date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L")(", keyColor[1] + L")(" + valuesColor);
                if (pos = date_ou_dates_wstr.find(L"("))
                    date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L"(", keyColor[1] + L"(" + valuesColor);
                if (pos = date_ou_dates_wstr.find(L")"))
                    date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L")", keyColor[1] + L")" + valuesColor);
                if (pos = date_ou_dates_wstr.find(L", "))
                    date_ou_dates_wstr = replace_all(date_ou_dates_wstr, L", ", keyColor[1] + L", " + valuesColor);
                date_ou_dates_wstr += L' ' + keyColor[1] + L'[' + valuesColor + L"pas-à-pas" + keyColor[1] + L']' + valuesColor;
                if (streaming != L"")
                    date_ou_dates_wstr += keyColor[1] + L" : " + valuesColor + streaming;
     
                return date_ou_dates_wstr;
            }
        }
        return L"";
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring streaming = L"";
    Pas compris !
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
    ...
                    if(dates_de_diffusion[0].someFlag)
                        date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
    ...
                if (dates_de_diffusion.back().someFlag)
                {
                    date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel" + keyColor[1] + L')' + valuesColor;
                }
    ...
        return L"";
    }
    Erreur ou pas ?

    Ok :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Episode
    {
    ...
        bool fichier_zero { false };
    ...
    };
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void Episode::Print()
    {
        if (affichage_Print_actif)
        {
            std::wstring wstr;
            bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(episode);
            if (chiffre_et_point_ou_pas)
            {
                wstr = std::to_wstring(saison);
                wstr += keyColor[1] + L'x' + valuesColor;
                wstr += std::to_wstring(episode);
                wstr += keyColor[1] + L" : " + valuesColor;
            }
            wstr += keyColor[1] + titre + valuesColor;
            if (deux_points != L"")
                wstr += deux_points + keyColor[1] + sous_titre + valuesColor;
            wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(duree_en_seconde/60) + keyColor[1] + min + L')' + valuesColor;
            wstr += keyColor[1] + L" : " + valuesColor + Print_Date_ou_Dates(dates_de_diffusion);
            std::wcout << wstr << std::endl;
            // phrases
            if (titre != L"")
                std::wcout << phrases << std::endl;
            else
                ;
     
        }
    }
    Pas terminé !!!

    En suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include <ctime>
     
    // Remplit un objet std::tm à partir d'un nombre de minutes
    std::tm fill_tm_from_minutes(long long minutes) {
        std::tm time = {}; // Initialise avec les valeurs par défaut
        long long remaining_minutes = minutes;
    ...
    et :
    Je vous laisse apprécier la bonne grosse boulette "time.tm_year += 1900;" à la place de "time.tm_year -= 1900;".
    Pas compris !

    Pas-à-pas et compliqué !
    Moi, simple !

    Merci beaucoup

  16. #556
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Et :
    Avertissement C4244 '=' : conversion de 'wchar_t' en 'char', perte possible de données Exemple C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\xutility 4537
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide.");
    std::invalid_argument : ok !
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw std::invalid_argument(L"'" + std::wstring{ m.begin(),m.end() } + L"' n'est pas un format de durée valide.");
    Marche pas !

    Voilà !

  17. #557
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Mars 09

    Expressément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Episode
    {
    ...
        std::wstring streaming{ L"" };
    ...
    };
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Episode::Episode(fs::path const& cheminFichier)
    {
    ...
        //std::wstring streaming = L"";
    ...
    Merci

  18. #558
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        pos = t[0].find(L" - ");
        if (pos != std::wstring::npos && !found2)
        {
            titre = t[0].substr(0, pos);
            deux_points = L" : ";
            sous_titre = t[0].substr(pos + 3);
            found2 = true;
        }
    Plus rapide ou pas ?

    Merci

  19. #559
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 119
    Points : 1 643
    Points
    1 643
    Par défaut
    Bonjour,

    Sans vouloir vous offenser, mais je remet en doute vos capacités cognitive à mener ce projet à bien.

    Après avoir regardé votre dépôt GitHub, je me demande s'il ne serait pas pertinent de revoir votre conception, et repartir sur des bases saines.
    Les affichages (entre autre) n'ont rien à faire dans vos classes métier (s'afficher n'est simplement pas leurs job).

    Vous voulez gérer un catalogue de séries.
    Sachant qu'une série contient des saisons,
    et qu'une saison contient des épisodes.

    Je vous suggère de commencer par la classe Episode (la plus profonde dans la hiérarchie),
    écrire son constructeur, ses accesseurs.

    Ensuite, écrire des fonctions pour tester la classe dans tous les sens.
    Une fois tous les tests validés, on passe à la classe supérieur.

  20. #560
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Je suis désolé ! Mais, monCul : j'aime pas !!!
    Ok ? Merci
    J'étais exaspéré par votre manque de réaction au fait que vous ne nommiez pas correctement vos fonctions/variable, etc...
    Le développement est bien assez difficile pour ne pas se mettre des bâtons dans les roues et nommant n'importe comment les choses.

    Vous n'aimez pas "monCul", très bien, alors n'aimez pas nommer n'importe comment vos fonctions/variable, etc..., SVP.
    Vous avez commencé à changer les noms des fonctions, c'est très bien, MERCI !!!
    GARDEZ CETTE HABITIDE.

    Problème : pas si ni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {...}
    Quelle est la question ? SVP !!!

    Ce que je peux dire, c'est que la fonction "Episode:rint_Date_ou_Dates" est horriblement complexe, et je pense pour pas grand-chose.

    La variable "affichage_Date_ou_dates", ok, mais ce n'est pas à la fonction qui "affiche les dates" de vérifier cela, c'est un raisonnement de plus haut niveau que l'affichage ou pas des dates, donc on dégage.
    "dates_de_diffusion.size() > 0" fait plein de fois à plein d'endroit, pour un effet nul, donc on dégage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    target_stream << std::put_time(&local, L"%d/%m/%Y");
    ...
    date_ou_dates_wstr = v_wstr[0].substr(0, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(3, 2) + keyColor[1] + L'/' + valuesColor + v_wstr[0].substr(6, 4);
    Ces lignes sont liées, si vous changez l'une vous cassez l'autre. On ne fait pas ce genre de chose avec des lignes séparées par plusieurs lignes. Sinon, c'est inmaintenable.

    Vous faites plusieurs boucles sur des structures équivalentes (dates_de_diffusion et v_wstr), au lieu de tout faire dans une seule boucle ?
    Pourquoi ???
    Ca rend le code dur à comprendre.
    Faire une seule boucle, c'est bien plus simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (v_wstr.size() == 1)
    Pourquoi distinguer ce cas, et si c'est pertinent, pourquoi les différences sont si peu "explicites" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return date_ou_dates_wstr;
    Un "return" en plein milieu d'une fonction, c'est rarement une bonne pratique.

    Vous séparez la génération du texte de la génération de la mise en page (fixation des couleurs, etc...), ça peut être bien sur le papier m'ais votre manière de faire est complexe et peu fiable. FAITES SIMPLE !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                    date = L"";
                    target_stream.str() = L"";
    C'est quoi ces machins ???
    Le C++ gère la durée de vie des variables, c'est pas à vous de le faire (mal).

    C'est quoi cette cochonnerie !!!

    Version simplifiée/maintenable de "Episode:: Print_Date_ou_Dates" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
        const std::wstring date_format = L"%d" + keyColor[1] + L"/" + valuesColor + L"%m" + keyColor[1] + L"/" + valuesColor + L"%Y";
        const std::wstring between_parenthesis = keyColor[1] + L"(" + valuesColor + L"%s" + keyColor[1] + L")" + valuesColor;
        const std::wstring same_date_format = between_parenthesis;
        const std::wstring prequel_format = between_parenthesis;
        const std::wstring streaming_format = keyColor[1] + L" : " + valuesColor + L"%s";
        const std::wstring step_by_step_tag = L' ' + keyColor[1] + L'[' + valuesColor + L"pas-à-pas" + keyColor[1] + L']' + valuesColor;
     
        std::wstring date_ou_dates_wstr = L"";
     
        std::vector<std::wstring> v_wstr;
        std::time_t last_date{ 0 };
        int same_date_counter = 0;
        for (auto dr : dates_de_diffusion)
        {
            std::time_t time = std::mktime(&dr.date);
     
            if (last_date != time)
            {
                std::tm localtime = *std::localtime(&time);
                std::wstringstream target_stream;
                target_stream << std::put_time(&localtime, date_format.c_str());
                std::wstring date_str = target_stream.str();
                v_wstr.push_back(date_str);
                same_date_counter = 0;
            }
            else
            {
                same_date_counter++;
                if (same_date_counter == 1)
                {
                    v_wstr.back() += wstring_format(same_date_format, L"1");
                }
                v_wstr.back() += wstring_format(same_date_format, std::to_wstring(same_date_counter + 1).c_str());
            }
            last_date = time;
        }
     
        for (auto i = 0; i < v_wstr.size(); i++)
        {
            if (i != 0)
                date_ou_dates_wstr += L", ";
            date_ou_dates_wstr += v_wstr[i];
        }
     
        if (dates_de_diffusion.size() == 1)
        {
            if (dates_de_diffusion[0].someFlag)
                date_ou_dates_wstr += wstring_format(prequel_format, L"préquel ou pas !");
        }
        else
        {
            if (dates_de_diffusion.size() > 0)
            {
                if (dates_de_diffusion.back().someFlag)
                {
                    date_ou_dates_wstr += wstring_format(prequel_format, L"préquel");
                }
                date_ou_dates_wstr += step_by_step_tag;
            }
        }
     
        if (streaming != L"" && date_ou_dates_wstr.length() > 0)
            date_ou_dates_wstr += wstring_format(streaming_format, streaming.c_str());
     
        return date_ou_dates_wstr;
    }
    Code utilitaire à mettre dans un .h qui va bien (en attendant de mettre votre code compatible C++20 et d'utiliser "std::format" à la place):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename ... Args>
    std::wstring wstring_format(const std::wstring& format, Args ... args)
    {
        int size_s = _snwprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
        if (size_s <= 0) { throw std::runtime_error("Error during formatting."); }
        auto size = static_cast<size_t>(size_s);
        std::unique_ptr<wchar_t[]> buf(new wchar_t[size]);
        _snwprintf(buf.get(), size, format.c_str(), args ...);
        return std::wstring(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
    }
    Ne trouvez-vous pas "mon" code de "Episode:: Print_Date_ou_Dates" plus clair et plus simple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring streaming = L"";
    Pas compris !
    De quelle ligne parlez-vous ?
    Elles sont toutes en commentaires sauf celle qui déclare le champ streaming dans la classe épisode, et encore, elle est un peu différente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring streaming{ L"" };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    std::wstring Episode::Print_Date_ou_Dates(std::vector<DateRecord>& dates_de_diffusion)
    {
    ...
                    if(dates_de_diffusion[0].someFlag)
                        date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel ou pas !" + keyColor[1] + L')' + valuesColor;
    ...
                if (dates_de_diffusion.back().someFlag)
                {
                    date_ou_dates_wstr += keyColor[1] + L" (" + valuesColor + L"préquel" + keyColor[1] + L')' + valuesColor;
                }
    ...
        return L"";
    }
    Erreur ou pas ?
    Voir "mon" code simplifié, ne noyez pas le sens du code dans des détails comme "keyColor" ou "valuesColor".
    Donc erreur car inutilement complexe, et difficile à changer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Episode
    {
    ...
        bool fichier_zero { false };
    ...
    };
    Pourquoi Faire ?
    Moins de code, moins de bugs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Episode::Print()
    {
    ...
    }
    Beaucoup trop complexe et peu lisible pour que cela fait vraiment.

    En utilisant la même approche que dans "mon" "Episode:: Print_Date_ou_Dates" refactoré (pas de variables et tests inutiles, ne pas cacher le sens du code avec des formules à ralonge, etc...), "Episode:: Print" : c'est 3 déclarations de chaines constantes, 2 if et 3 appels à "wstring_format", rien d'autres et ça serait bien plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Remplit un objet std::tm à partir d'un nombre de minutes
    std::tm fill_tm_from_minutes(long long minutes)
    Comme déjà indiqué, std::tm, c'est pour une date+heure dans la journée, pas pour une durée.
    Donc "fill_tm_from_minutes" n'a aucun putain de sens.

    Je vous laisse apprécier la bonne grosse boulette "time.tm_year += 1900;" à la place de "time.tm_year -= 1900;".
    Pas compris !
    Dans le champ "tm_year" d'un "std::tm", on ne met pas l'année de la date mais l'année décalée de 1900 en moins, pour que la date de "01/01/1900" ai une valeur dans son champ "tm_year" de 0, pas 1900.
    Le code généré par l"IA a fait l'opération inverse de celle à faire, il faut soustraire 1900 à la date pour remplir le champ "tm_year" et pas la soustraire.
    Mais bon, tout ça parce qu'vous voulez utiliser un vieux machin qu'est "std:tm" qui est tout pourri.

    message du "20/03/2024, 23h10":
    C'est parce que la gestion des erreurs "standards" n'utilise pas de chaine de caractères unicode. Laissez le warning. On verra après comment adapter la gestion standard des erreurs avec des caractères unicode. Avec la situation actuelle, au pire, vous aurez des messages d'erreurs avec des accents mal encodés.

    message du "21/03/2024, 12h18":
    Oui supprimez la variable locale pour utiliser le champ à la place, pour que la valeur initialisée (dans le constructeur de la classe Episode) soit visible de toutes les fonctions d'instance de l'objet "Episode".

    message du "21/03/2024, 14h00":
    Plus rapide ou pas ?
    Plus rapide que quoi ?
    Et la vitesse, on s'en cogne.
    Faites du code lisible et sur !!!
    Exempls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        const std::wregex soustitre_format_rg{ L"(.+) \\- (.+)" };
        std::wsmatch soustitre_match;
        if (std::regex_match(texte_a_analyser, soustitre_match, soustitre_format_rg))
        {
            std::wstring titre = soustitre_match[1];
            std::wstring sous_titre = soustitre_match[2];
        }
    Avec cela, on peut changer facilement de séparateur, gérer facilement l'absence d'espace, les espaces en trop, etc... pour un code plus lisible (quand on connait les expressions régulières) et plus évolutif (sections optionnels, sections récursives, etc...).

    @deedolith, je trouve qu'il a progressé et la séparation de la logique et de l'affichage pourra facilement se faire après et pour son type de projet, je ne crois pas que cela soit très judicieux.

+ 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