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 :

Relancer le programme a partir du code


Sujet :

C++

  1. #1
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par d�faut Relancer le programme a partir du code
    Hola todos,

    Comme vous l'avez s�rement d�j� compris, je cherche � relancer mon programme � partir de mon code (si une condition n'est pas satisfaite).
    Je ne trouve pas de "m�thode" ou "d'appel � une fonction" d�j� existante, je fais donc appel � vos connaissances.
    En esp�rant avoir �t� clair dans ma demande !

    Merci d'avance,
    Bien cordialement

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 131
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 131
    Billets dans le blog
    150
    Par d�faut
    Bonjour,

    Vous pourriez rappeler manuellement la fonction main(), mais, je n'aime pas beaucoup cette m�thode.
    Par contre, pourquoi ne pas envisager un code comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
        while (cond)
        {
            prog1();
        }
        prog2();
     
        return 0;
    }
    Vous souhaitez participer � la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui conna�t l'erreur, conna�t la solution.

  3. #3
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par d�faut
    Bonjour,
    Tout d'abord, merci pour la r�ponse.
    Cependant, j'ai d�j� pens� � cette solution et j'ai peur de surcharger mon main sachant que je veux juste relancer mon programme.
    Un appel au main permettrait au m�me moment de d�truire la premi�re instance ?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 131
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 131
    Billets dans le blog
    150
    Par d�faut
    Un appel au main ne d�truira rien.
    Note : g�n�ralement, on gardera le strict minimum dans le main : l'analyse des arguments et le lancement du "reste du programme"
    Je propose une seconde version.


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void prog1(bool& cond)
    {
        // Exécution normale (vous faites le travail nécessaire)
        cond = false; // Provoquera l'arrêt total du programme (pas de redémarrage)
        return;
    }
     
    int main()
    {
        bool cond=true;
        while (cond)
        {
            prog1(cond); // 
        }
     
        return 0;
    }
    Sinon, il faudra expliciter votre besoin.
    Vous souhaitez participer � la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui conna�t l'erreur, conna�t la solution.

  5. #5
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    A vrai dire, il faut surtout savoir quand la condition doit �tre �valu�e.

    En effet, si la condition n'est �valu�e qu'une seule fois en d�but du programme, une approche coh�rente pourrait ressembler � ce que fait un "updater", par exemple
    updater.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
     
    int update_to(int version){
        /* mise à jour des composant */
       return last_version; //renvoie le numéro de la version téléchargée
    }
    int main(){
        int current_version =/* on la récupère comme on veut, sans doute dans un fichier de conf*/;
        while(true){
            int server_version = /* on la récupère comme on veut, sans doute en passant par le réseau */;
            if(server_version >current_version){
                current_version = update_to(server_version)
            }
            exec("mainProgram.exe");
    };
    Et, d'un autre cot�, on a le "program principal" qui lui, fonctionne de "mani�re classique", quitte � v�rifier r�guli�rement si la condition pour qu'il puisse fonctionner est toujours valide, par exemple
    mainProgram.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    int main(){
        while(conditon) {
            /* tout ce qui doit être fait tant que la conditon est remplie */
        }
        return 0; // on peut considérer (sauf autre complication) que le programme s'achève correctement
    }
    Car, il faut savoir que, m�me si on peut appeler une fonction de mani�re r�cursive, ce n'est jamais une bonne id�e que d'appeler la fonction principale de la sorte (sauf erreur, il me semble m�me que la norme pr�voie que cela occasionne un comportement ind�fini), sous une forme proche de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    //!!!! ATTENTION !!!! A NE SURTOUT PAS FAIRE !!!
    int main(){
        while(condition){
            /* ... */
        }
       main();
    return 0;
    }
    Maintenant, rien ne t'emp�che de d�l�ger la "boucle principale" de l'ex�cution � "autre chose", par exemple sous une forme proche de
    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
    class Application{
    public:
        /* ... */
       void execute(){
           /* la vraie logique se trouve ici */
           while(conditon){
               /* ...*/
           }
       }
    };
    int main(){
        while(true){
            try(){
                 Application app;
                 app.execute();
            }catch(...){ //s'assure que l'on ne sortira pas du programme, même en cas d'exception non gérée
                // ne fait rien ou log le problème, au choix
            }
        }
    }
    A conditon de travailler correctement (et donc de tout mettre en oeuvre pour que Application::execute() et les fonctions qui sont appel�e de mani�re directe ou indirecte n'occasionnent entre autres aucune fuite m�moire / lib�re correctement TOUTES les ressources dont elle a besoin), ton application ne s'arr�tera jamais r�ellement
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  6. #6
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    main est une fonction sp�ciale, que l'on n'a ni le droit de surcharger, ni d'appeler:
    Citation Envoy� par La norme 3.6.1 Main function
    �2: This function shall not be overloaded.
    �3: The function main shall not be used within a program
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  7. #7
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    main est une fonction sp�ciale, que l'on n'a ni le droit de surcharger, ni d'appeler:
    Il me semblait bien que la norme disait quelque chose du genre, mais j'avais la flegme d'aller v�rifier moi-m�me
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  8. #8
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par d�faut
    Merci encore pour toutes ces r�ponses, ce que j'essaie de faire pour �tre plus pr�cis, c'est d'�valuer l'entr�e d'une valeur, si celle ci ne correspond � rien indiquer � l'utilisateur que c'est faux et le faire recommencer.

    Voici une partie du code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    cout << "For an equation like : df/dt + u(df/dx)=0 : " << "\n";
    cout << "Which scheme do you want ? 1 For Explicit UpWind, 2 For implicit Upwind : ";
    cin >> Scheme;
     
    if (C.test(Scheme) == true)
    {
    // la j’exécute mon programme
    }
    else 
    {
    //relancer le main pour redemander la valeur de mon "scheme"
    }
    Je cherche une astuce assez simple et l�g�re car c'est quelque chose d'optionnel pour faciliter l'utilisation du logiciel.

  9. #9
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Tant que le programme n'a pas besoin de mettre � jour son propre exe:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    bool g_exit = false;
    int main() {
      while (!g_exit) {
        // programme, ouverture fenetre etc...
        // ne pas oublier de modifier g_exit pour que le programme quitte vraiment et ne recommence pas
      }
    }
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  10. #10
    Membre habitu�
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2016
    Messages
    10
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 31
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2016
    Messages : 10
    Par d�faut
    Parfait ! Ce m'a permit de comprendre comment faire ce que je voulais ! Merci bien !

  11. #11
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 504
    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 504
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    int main(){
        while(true){
            try(){
                 Application app;
                 app.execute();
            }catch(...){ //s'assure que l'on ne sortira pas du programme, même en cas d'exception non gérée
                // ne fait rien ou log le problème, au choix
            }
        }
    }
    Virez-moi ce "try()catch(...){..}" !!!!!

  12. #12
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    Virez-moi ce "try()catch(...){..}" !!!!!
    Ben, si le souhait est vraiment que l'application ne s'arr�te JAMAIS, le try()cat(...) fera l'affaire, en s'assurant que tout repartir dans un �tat "coh�rent" (m�me s'il risque de ne pas y rester longtemps)

    Mais, de mani�re g�n�rale, je consid�re que ce n'est pas � l'application de d�cider si elle doit effectivement rester active en permance, qu'elle finisse par s'arr�ter sur une exception ou non...

    Selon moi, la responsabilit� doit incomber "� autre chose"
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  13. #13
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Mais, de mani�re g�n�rale, je consid�re que ce n'est pas � l'application de d�cider si elle doit effectivement rester active en permance, qu'elle finisse par s'arr�ter sur une exception ou non...

    Selon moi, la responsabilit� doit incomber "� autre chose"
    Ou au moins, l'application peut demander � �tre red�marr�e en cas de crash...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Ex�cuter un programme � partir du code C
    Par TempArea dans le forum C
    R�ponses: 7
    Dernier message: 08/04/2010, 01h03
  2. Executer un DTS a partir du code VB
    Par Total dans le forum VB 6 et ant�rieur
    R�ponses: 8
    Dernier message: 17/11/2005, 15h23
  3. [LG]Relancer le programme et chemin d'acces
    Par Niko92 dans le forum Langage
    R�ponses: 2
    Dernier message: 16/12/2004, 11h56
  4. faire de l'UML ou de la doc � partir du code?
    Par Gothico dans le forum Autres �diteurs
    R�ponses: 6
    Dernier message: 28/05/2004, 10h52
  5. R�ponses: 4
    Dernier message: 16/01/2003, 14h42

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