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 :

redemarrer mon programme


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut redemarrer mon programme
    Bonjour/bonsoir,

    je voulais savoir s'il est possible en C de recommencer entièrement mon programme (j'entend par là tout reexecuter en vierge, y compris les initialisations des variables globales qui sont avant le main), ou a défaut d’appeler le programme en tant que sous programme?

    Il s'agit d'éviter un long bout de code (qui en plus pour l'instant ne marche pas) alors qu'il suffirait de faire un copier-coller dans le fichier d'ouverture et de relancer le programme pour éviter tout ça.

    Merci d'avance
    Katorps

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    sous Unix/Linux, "écraser" ce qu'exécute le processus courant se fait via la famille des fonctions en exec... En rergardant vite fait sur le net, j'ai vu que Windows proposait aussi ce genre de fonctions.

    Typiquement, ces fonctions sont utilisées après un fork (clonage du processus courant) dans - souvent - le code du processus fils pour lui faire exécuter autre chose. Autant dire que ça ne fait pas dans la dentelle, mais là, pour le coup, c'est justifié.

    Dans ton cas, ça m'a l'air un peu radical, voire carrément bourrin. Mais je ne m'avancerai pas plus parce que je ne comprends pas tout à tes explications ...

    Si un long bout de code, qui plus est, ne marche pas, que tu veux le "sauter", et bien il y a les commentaires, non ?

    Relancer le même exécutable ... c'est "mêmes causes, mêmes effets". Ou alors la méthode Shadoks : plus ça rate, plus on a de chances que ça marche !

    Que peut bien vouloir dire
    il suffirait de faire un copier-coller dans le fichier d'ouverture et de relancer le programme pour éviter tout ça
    Je ne comprends pas mais ça a l'air simple. Pourquoi ne pas le faire ? Pourquoi faut-il relancer le machin ?

    Bizarre, bizarre ...

    Avec un bout de code, on y verrait certainement plus clair.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Je pense que tu as un problème de conception de ton programme. Un programme n'est pas fait pour redémarrer. Il est fait pour exécuter une tache, éventuellement plusieurs fois. Ce que fait ton programme pourrait une fonction, qui en cas d'erreur sortirait avec un code retour particulier, indiquant au main() de relancer cette fonction.

  4. #4
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par katorps Voir le message
    je voulais savoir s'il est possible en C de recommencer entièrement mon programme (j'entend par là tout reexecuter en vierge, y compris les initialisations des variables globales qui sont avant le main), ou a défaut d’appeler le programme en tant que sous programme?

    Il s'agit d'éviter un long bout de code (qui en plus pour l'instant ne marche pas) alors qu'il suffirait de faire un copier-coller dans le fichier d'ouverture et de relancer le programme pour éviter tout ça.
    Bon, déjà, théoriquement, tu pourrais te faire un module opaque qui manipule les données dont tu as besoin, et qui les réinitialise au besoin. Cependant, c'est parfois difficile, et on n'a pas toujours accès à toutes les données nécessaires. Au passage, je ne suis pas certain que execve soit une très bonne idée, du fait qu'on se retrouve avec une sorte de récursivité croisée assez gênante quand on réinitialise un bon nombre de fois.

    Bref, je m'étais également, une fois, confronté au problème, et j'avais procédé avec une simple duplication de processus : pendant que le fils exécutait « réellement » l'application, le père attendait la fin de ce dernier. Suivant la valeur de retour envoyée par le fils, on relance un nouveau processus, ou on quitte définitivement. En gros, le squelette de l'application était (en émulation de boucle) :

    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
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <unistd.h>
     
    int main(void)
    {
        int status;
    fork_pr:
        switch (fork()) {
        case -1:
            /* log error */
        case 0:
            /* execute application */
        default:
            wait(&status);
            if (status == /* ... */) goto fork_pr;
        }
        return 0;
    }
    Pour des connexions plus conséquentes, on peut toujours y aller à coup de tubes (la mémoire partagée est ici inutile, car ça compliquerait les réinitialisations).
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Merci pour vos réponses, j'ai finalement trouvé une solution un (petit) peu plus élégante : je ne fais que déclarer mes variables globales, mais je ne les initialise pas; puis dans le main, je les initialise (bon, ça me fait 50 lignes de code de plus). juste avant le , je met un goto qui renvoi à une étiquette placée à la première ligne du main et exécuté si la variable "relancer" vaut 1.

    ça fonction sans trop de problème (je détruis la fenêtre, puis je la reouvre ensuite.

    Sinon, pour ceux qui n'avaient pas compris le problème, il s'agit d'un programme qui ouvre automatiquement un fichier donné qui contient l'état de la dernière sauvegarde (avec toutes les données utiles) et qui à partir de là initialise le programme à proprement parler (création des widget en gtk+).
    Ensuite j'ai voulut proposer d'ouvrir une sauvegarde lus ancienne, et mon idée de départ était simplement de transférer ces infos dans le fichier de démarrage puis redémarrer le programme (vu qu'au démarrage le lancement ne posait aucun problème (car on n'était pas encore dans la boucle evénementielle).

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

Discussions similaires

  1. envoyer un mail avec mon programme
    Par shrek dans le forum C++Builder
    Réponses: 8
    Dernier message: 06/12/2006, 12h27
  2. [Lien]erreur dans mon programme python
    Par durnambule dans le forum Général Python
    Réponses: 11
    Dernier message: 29/01/2004, 14h59
  3. [DiVERS] -> Arrêter et redemarrer son programme ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/08/2003, 15h25
  4. [] Utiliser AVI d'une DLL dans mon programme
    Par seb.49 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/05/2003, 14h52
  5. Réponses: 11
    Dernier message: 17/03/2003, 10h56

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