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

Turbo Pascal Discussion :

Fonctionnement de la procédure EXEC


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut Fonctionnement de la procédure EXEC
    Bonjour à tous !

    Je m'amuse donc à développer un wargame depuis longtemps et la taille des fichiers augmentant, il m'est devenu impossible de tout garder avec un seul programme principal. Après avoir tourné en rond, désespéré comme il se doit, j'avais réussi à trouver dans la documentation, à l'époque, une procédure qui semblait résoudre ma difficulté et qui l'a fait pendant quelques années : EXEC.

    En clair, j'ai créé un petit programme qui, par le biais de cette procédure EXEC, permettait de lancer le programme correspondant au besoin du moment. Pour passer l'information quant au programme à lancer, il suffisait de créer à chaque fin de programme un fichier temporaire qui donnait le nom du programme suivant à lancer, fonction des ordres données par l'utilisateur. Sinon, à défaut de fichier, il savait qu'il devait lancer le menu du jeu.

    Voici ce que donnait la partie principale de ce petit programme. ANAMNA est le nom du wargame, de mon univers de jeu de rôle et de ce programme. ANAMNAD est le "début" (présentation animée du jeu "échappable") et ANAMNAM est le menu du jeu.

    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
     
    BEGIN
       LigneCmd:='';
       NomProgram:='ANAMNAD.EXE';
       SwapVectors;
       Exec(NomProgram, LigneCmd);
       SwapVectors;
       NomProgram:='ANAMNAM.EXE';
       SwapVectors;
       Exec(NomProgram, LigneCmd);
       SwapVectors;
       repeat
          {$I-}
          assign(ff,'ANAMNA.TMP');
          reset(ff);
          {$I+}
          readln(ff,version);
          if version<>ver then begin
             close(ff);
             efface_tous_les_fichiers_inutiles;
             textcolor(15);
             clrscr;
             writeln('ERREUR LANCEMENT PROGRAMME ''LES GUERRES D''ANÄMNA"')
             writeln('LANCEMENT INTERROMPU...');
             writeln;
             writeln('@ DUGUERPF / Les guerres d''AnäMna / 1996-2009 / ver 3.0.2703');
             halt;
          end;
          readln(ff,texte);
          if texte<>'FIN DU JEU' then begin
             NomProgram:=texte;
             SwapVectors;
             Exec(NomProgram, LigneCmd);
             SwapVectors;
          end;
          close(ff);
       until texte='FIN DU JEU';
       efface_tous_les_fichiers_inutiles;
       textcolor(15);
       writeln('@ DUGUERPF / Les guerres d''AnäMna / 1996-2009 / ver 3.0.2703');
    END.
    Et maintenant, la question : tout cela fonctionnait parfaitement jusqu'à WIN98, mais tout plante sous WINXP et plus. Quelqu'un a-t-il une soluce ?

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Tu peux essayer de réduire la taille allouée pour le tas de ton programme appelant avec la directive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {$M TaillePile,0,TailleTasMaxi}
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    En fait, actuellement, ma commande est :

    Mais, quelques soient les modifications, cela ne passe pas, y compris ce qui me semble le max :

    Euh, ai-je oublié de dire que de toute façon je ne comprends rien à cette commande ? De fait, les tas de mémoire, les piles et tout ça, c'est chez moi un peu comme les pointeurs. Pas brillant !

    La ligne de commande que j'utilise était celle proposée dans l'aide fournie par TP pour la procédure EXEC...Elle ne me doit rien.

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par DUGUERPF Voir le message
    En fait, actuellement, ma commande est :

    Un tas de 0 octet : je suppose donc qu'il n'y a pas d'allocation de mémoire dynamique dans ton programme ?

    Mais il faudrait peut-être augmenter la taille de la pile car je pense que le programme appelé utilise la pile de l'appelant (je ne peux vérifier actuellement car je suis au boulot).

    Pour détailler les différents paramètres de la directive $M :

    La pile est la zone de mémoire dans laquelle sont déposés tous les paramètres passés aux différentes routines, où sont déposées les adresses de retour au code appelant, où sont effectuées les sauvegardes de registres, où sont allouées toutes les variables locales. Lorsque la pile déborde, c'est pratiquement le crash assuré; il ne faut donc pas définir une taille de pile trop petite. Essaye par exemple une taille de 16384 octets (ou même plus, la limite étant 64 Kb).

    Le tas est la zone de mémoire dans laquelle ton programme va allouer ses variables dynamiques. Par défaut, un tas de 640 Kb est alloué à ton programme, sauf si tu définis un tas de plus petite taille.

    La directive {$M TaillePile,TasMini,TasMaxi} signifie :
    • TaillePile = la taille de la pile, qu'il faudrait donc essayer d'augmenter
    • TasMini = la taille minimale du tas (en général 0)
    • TasMaxi = la taille maximale du tas
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Membre averti

    Inscrit en
    Janvier 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2009
    Messages : 37
    Par défaut
    Allocation de mémoire dynamique (essaie de prendre l'air sérieux du gars qui comprend la question et devine que la réponse n'est pas simple...).

    Pour tout dire, encore un des mystère informatique pour moi. En fait, tas, pile et pointeurs sont liés dans ma découverte de TP et surtout dans mes incompréhensions, même si sur le papier cela paraît évident.

    Note que j'ai essayé en mettant tous les paramètres au maximum de ce qu'offre la commande de compilation et que cela plante aussi. Mais cf pb avec les drivers souris : je vais essayer sous environnement DOS complet. On verra !

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    J'aimerai bien pouvoir tester le wargame. Le jeu doit etre super genial.

Discussions similaires

  1. Fonctionnement de la procédure COMPRESS
    Par theolarrousse dans le forum SAS Base
    Réponses: 2
    Dernier message: 16/03/2015, 09h48
  2. Réponses: 9
    Dernier message: 09/05/2013, 17h27
  3. [AC-2007] Question sur fonctionnement fonction ou procédure
    Par tibofo dans le forum VBA Access
    Réponses: 5
    Dernier message: 07/05/2010, 21h41
  4. Fonctionnement de la procédure VARCLUS
    Par mitmit dans le forum SAS STAT
    Réponses: 3
    Dernier message: 07/01/2008, 09h21
  5. Procédures stockées : EXEC vs ADODB.command
    Par glidez dans le forum ASP
    Réponses: 2
    Dernier message: 13/12/2005, 10h59

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