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

Lazarus Pascal Discussion :

Supprimer des goto venant d'un programme Fortran [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Supprimer des goto venant d'un programme Fortran
    Bonjour à toutes et à tous,

    J'ai récupéré un programme Fortran que j'ai converti en programme Pascal. Mais il comporte des goto que j'aimerais bien supprimer. J'ai du mal à voir comment.

    Voilà, synoptiquement comment cela se présente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (m <> n) then goto 5;
    if (k = 3) then goto 6;
    Block d'instructions A;
    goto 6;
    5: Block d'instruction B;
    6: Block d'instructions C;
    Si vous avez des idées ... je vous en remercie d'avance.

    NOTA : j'aimerais par ailleurs ne pas avoir à faire de sous-routines car le nombre de variables à faire passer en aller retour est très grand.

    Cordialement.

    Pierre

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    La solution: Passer par des sous-routines C'st franchement le plus propre, même si c'est contraignant, par rapport au nombre de variables en paramètres.

    Sinon, utiliser des "if then else" si les blocs ne sont pas appelés plusieurs fois.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    Dans l'exemple que tu donnes, le bloc C (6) peut être appelé 2x (si k <> 3).
    L'emploi de sous-routines (comme on disait en Fortran) est obligatoire pour éviter de réécrire plusieurs fois le même code.
    De plus, ton programme sera mieux structuré (important en cas d'update).

    Si tu veux éviter le passage de variables en paramètres, tu peux déclarer les variables comme globales (publiques).
    Le hic, c'est que dans ton code, les noms de variables sont très courts (une lettre) et peuvent prêter à confusion (ou pire) avec des variables locales.
    Si tu ne veux pas renommer tes variables, voici une solution.
    J'ai pris l'habitude de déclarer et d'initialiser les variables globales dans une unité spécifique (p.ex. "define.pas"). Bien sûr, je leur donne un nom facilement reconnaissable, mais dans ton cas, il te suffit d'ajouter "define." devant le nom de ta variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure Faire;
    var
    S: string;
    begin
       S:= 'Hello';
       Define.S:= 'World';
    end;
    Thierry

  4. #4
    Membre éclairé
    Homme Profil pro
    web a11y
    Inscrit en
    Avril 2014
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : web a11y
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2014
    Messages : 157
    Points : 717
    Points
    717
    Par défaut
    Vite fait, tu fais un diagramme, ou tu résumes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    si (m<>n) alors B puis C puis fin
    si (k=3) alors C puis fin
    autre : A puis C puis fin
    On en arrive à tester k≠3 plutôt que k=3.
    Ce qui doit ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (m <> n)  then
        code_B ;
    else
        if (k <> 3) then
            code_A ;
        /* end_if k */
    /* end_if m */
    code_C
    [Edit] sinon (grillé !), comme les précédents, je suggère moi aussi l'utilisation d'une (ou +) structure(s) qui contient tout ton ensemble de données. Plus facile à passer en paramètre, et tu peux garder la logique de présentation par rapport au Fortran, pour relectures ultérieures.

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Je vous remercie pour les solutions apportées. Celle que j'ai adoptée est proche de celle de Stellar7.

    Garder la logique de présentation du Fortran ? A mon avis : aucun intérêt. Lorsqu'on est habitué aux structures et tous les "if then else", ces dernières sont bien plus claires.

    Par contre, dans le cas présent, les blocs comportent peu de lignes, mais beaucoup de variables qui évoluent en même temps. On est au sein d'un algorithme de répétition et je ne pense pas que le passage de variables, en valeurs ou en adresses (pour les retours) aillent dans le sens de la rapidité, pas plus que de la clarté.

    Il y a certainement des cas où les structures doivent s'imposer, mais ici, je n'en ai pas vu l'intérêt.

    En tout cas, merci.

    Cordialement.

    Pierre

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

Discussions similaires

  1. tracer des résultats générés par un programme Fortran
    Par manaiilhem dans le forum MATLAB
    Réponses: 5
    Dernier message: 11/03/2013, 17h28
  2. extension des programme fortran
    Par membreComplexe12 dans le forum Fortran
    Réponses: 0
    Dernier message: 17/02/2011, 13h41
  3. PC-BSD Supprimer des programmes
    Par SpeedHunter dans le forum BSD
    Réponses: 0
    Dernier message: 09/06/2010, 18h23
  4. Réponses: 2
    Dernier message: 06/11/2008, 07h42
  5. Réponses: 1
    Dernier message: 16/06/2007, 16h06

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