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

Langage Delphi Discussion :

delphi: instruction GOTO


Sujet :

Langage Delphi

  1. #41
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    Oui en général, mais l'alternative n'existe pas toujours sinon Mr le responsable du langage pourrait tout simplement supprimer l'instruction goto du compilateur or elle persiste... à méditer
    Le fait qu'elle n'ait pas été supprimée ne veut pas dire qu'elle soit indispensable.
    Borland n'a jamais rien voulu supprimer du langage Pascal d'origine, même si plus personne ne sait que ça existe.

    Par exemple, en Delphi on peut toujours déclarer un tableau de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var tableau : array (. 1..5 .) of integer;
    Et a cette époque, on avait l'habitude de coder avec des langages où les lignes étaient numérotées, où travailler uniquement avec des boucles, des if et des appels de procédure était presque une révolution. Faire un langage sans GOTO était tout simplement impensable.
    Je me souviens que lorsque j'ai apris le Pascal à cette époque, je trouvais en plus que la syntaxe pour les goto étaient particulièrement lourde car il fallait déclarer les LABEL !

  2. #42
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Kaféine Voir le message
    Désolé si j'ai heurté ta sensibilité mais bon je connais pas tous les sigles AZT notamment...(maintenant je sais)
    Nop, on oublie. Penses juste que cela peut heurter violemment certains qui sont soit atteints de cette saleté, soit ayant des proches dans ce cas.

    Citation Envoyé par Kaféine Voir le message
    On peut toutefois remarquer qu'à chaque fois que l'on parle de cette instruction ca suscite des débats philosophiques et c'est ce qui m'amuse.
    Ce qui est normal : cela rejoint directement le "bien coder" du "pisser du code non maintenable"...

    Citation Envoyé par Kaféine Voir le message
    Pour ce qui concerne l'anecdote du exit, (oui il execute le bloc finally oui a condition qu'il se trouve dans le bloc try en vis à vis), c'était pour souligner le fait que le exit peut poser des problèmes de lecture du code pour certains. Evidemment les goto etaient interdits et envisagé d'interdire le exit aussi.
    Disons que le "goto" est néfaste à la lecture dans la plupart des cas... Le "exit" (ainsi que "break" et "continue", d'ailleurs) ne l'est que si l'on n'a pas compris les exceptions et/ou les concepts de portée, ce qui veut donc dire que l'on n'a pas compris une partie importante du langage.

    Citation Envoyé par Kaféine Voir le message
    Rétrocompatibilité, je veux bien.....
    Depuis le temps il aurait pu le deprecated.
    Sauf que c'est une instruction, et non pas une fonction... Et c'est utile à très bas niveau, uniquement dans le contexte où les exceptions ne sont pas gérées (que ce soit par performances ou par nécessité, d'ailleurs).
    On ne peut donc pas le retirer du langage, car il est nécessaire à sa bonne implémentation... Mais c'est très exactement comme, en C, l'utilisation abusive des macros, casts et opérateurs ternaires : ce n'est pas parce que la CLib fonctionne massivement grâce à ça qu'il est salutaire de le propager dans le code utilisateur.

    Citation Envoyé par Kaféine Voir le message
    Si je suis ton raisonnement, ils peuvent surement s'en passer et c'est a mon avis le cas sauf que les developpeurs qui ont codé ça connaisse l'instruction, ses risques, ses faiblesses et n'ont pas jugé utile de modifier le code.
    C'est surtout une question de contexte. Les exceptions sont coûteuses en terme de temps CPU, et ne peuvent donc pas être appliquées dans des cas de déroutement "fréquent" du code : on utilise donc des "goto", afin de conserver le principe des exceptions sans trop de pénalités côté code.

    Mais c'est exactement du même ordre que d'inclure de l'ASM directement dans ton code Delphi : ça marche, OK, mais ce n'est habituellement pas souhaitable en dehors du très bas niveau. Tu deviens dépendant de l'implémentation et de la traduction du compilateur, tu mets le bronx dans les optimisations du compilateur, et tu rends ton code bien moins portable (voire pas portable du tout)... Y compris entre les différentes versions de Delphi !!

    Donc, au sein de la VCL, maintenue par l'éditeur, c'est une chose. En dehors de la VCL (ou couches équivalentes comme Indy), c'est néfaste.

    Citation Envoyé par Kaféine Voir le message
    On peut toujours se passer de goto ! la question est donc pourquoi il ne le supprime pas c'est tout.
    Parce que ce n'est pas une fonction, mais une instruction : cela change donc la grammaire du langage.
    Ce serait aussi difficile (et problématique !!) que de supprimer le mot-clé "Const", pour pas mal de raisons largement HS par contre (revalidation des compilateurs / traducteurs, perte de rétrocompatibilité, impossibilité de tracer certains sources RTL, etc.).

    Mettre une fonction en "deprecated", c'est assez facile, surtout que l'on fournit la plupart du temps une fonction de remplacement... Donc, on maintient l'ancienne vivante (mais non maintenue), et on préconise la nouvelle.
    Pour une instruction, ce n'est pas tout à fait aussi simple hélas. Il est possible de générer un warning pour ça, mais bonjour le bronx côté chaîne de compilation : c'est du bidouillage complet, car habituellement il n'y a pas de warnings au niveau de l'analyse lexicale, uniquement des erreurs...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #43
    Inactif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 182
    Points : 212
    Points
    212
    Par défaut Finalement
    c'est quoi la bonne solution?
    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
     
     
     for z := 1 to J1 do
      begin
       if pos(Liste1[z][1], S1) <> 0 then
        continue; //  <==== le revele est present
       if pos(Liste1[z][2], S1) <> 0 then
        continue; //  <==== le revele est present
       if pos(Liste1[z][3], S1) <> 0 then
        continue; //  <==== le revele est present
       inc(R); //  <==== combinaison bonne
       Move(Liste1[z], Liste1[R], 10);
       fin:
      end;
     J1 := R;
    end;
     
    for z := 1 to J1 do
     begin
      if pos(Liste1[z][1], S1) <> 0 then
       goto fin; //  <==== le revele est present
      if pos(Liste1[z][2], S1) <> 0 then
       goto fin; //  <==== le revele est present
      if pos(Liste1[z][3], S1) <> 0 then
       goto fin; //  <==== le revele est present
      inc(R); //  <==== combinaison bonne
      Move(Liste1[z], Liste1[R], 10);
      fin:
     end;
     
    for z := 1 to J1 do
     begin
      if pos(Liste1[z][1], S1) = 0 then
       if pos(Liste1[z][2], S1) = 0 then
        if pos(Liste1[z][3], S1) = 0 then
         begin
          inc(R); //  <==== combinaison bonne
          Move(Liste1[z], Liste1[R], 10);
         end;
     end;
     
     for z := 1 to J1 do
     begin
      if (pos(Liste1[z][1], S1) = 0) 
       and (pos(Liste1[z][2], S1)) = 0)
        and (pos(Liste1[z][3], S1)) = 0 then
         begin
          inc(R); //  <==== combinaison bonne
          Move(Liste1[z], Liste1[R], 10);
         end;
     end;
    Mon sentiment c'est que tu codes comme tu en as l'habitude: les instructions ne changeront rien a ta logique:
    Boris


    Vos versions?
    Papy

    Nul ne pourra jamais vous empêchez d'être libre.

  4. #44
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    @Franck
    je suis d'accord c'est pas parce que ca existe que c'est indispensable , comme moi finalement j'existe et je suis pas indispensable

    Oui en utilisant deprecated je pensais suppression.

    Ok je veux bien admettre que le goto peut être utile à un trés bas niveau.
    dans ce cas pourquoi des langages comme c# ont toujours l'instruction goto !? Et la pas de question de rétrocompatibilité, le langage étant "jeune" et sensé prendre le meilleur de java (qui prend le meilleur du C) et le meilleur de delphi.....

    Finalement la solution comme le dit Franck c'est l'oublie...

    wahoo c'est beau comme phrase
    Akim Merabet

  5. #45
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par FullSpeed Voir le message
    c'est quoi la bonne solution?
    Le souci de celle avec "goto", c'est qu'un déplacement du label te fout tout en l'air... Le copier-coller, c'est mal, mais c'est courant : la preuve, t'as laissé un label "fin:" dans la première version, qui n'en a pourtant absolument pas besoin...

    Citation Envoyé par FullSpeed Voir le message
    Mon sentiment c'est que tu codes comme tu en as l'habitude: les instructions ne changeront rien a ta logique:
    Non, mais ça change des choses au niveau performances et maintenabilité. Par exemple, ta 3ème version est plus performante que la 4ème, car il n'y a pas d'évaluation paresseuse en Pascal.
    Et la 1ère version possède moins de risques d'être flambée que la 2ème en cas de modifications, elle est donc "mieux maintenable".


    Citation Envoyé par Kaféine Voir le message
    dans ce cas pourquoi des langages comme c# ont toujours l'instruction goto !?
    Regarde du code d'interfaçage C#/C++, par exemple, quand tu câbles une DLL C/C++ vers du C#... Pour le C#, c'est du "bas niveau", ça...

    Citation Envoyé par Kaféine Voir le message
    Finalement la solution comme le dit Franck c'est l'oublie...
    Disons plutôt qu'il est "important de le connaître pour pouvoir l'oublier"...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #46
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Par exemple, ta 3ème version est plus performante que la 4ème, car il n'y a pas d'évaluation paresseuse en Pascal.
    Heu, ici c'est le forum Delphi.
    Il y a très longtemps que par défaut, le compilo arrête l'évaluation des expressions booléennes dès lors que le résultat est connu. Maintenant, il faut positionner une directive pour que le compilo fasse l'évaluation complète de la formule.

    D'ailleurs, les boucles s'écrivent généralement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (i<List.Count) and List[i]<>...) do
    begin
      inc(i);
    end;
    Avec l'évaluation complète, ce serait l'erreur assurée une fois arrivé à la fin de la liste !

  7. #47
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Il y a très longtemps que par défaut, le compilo arrête l'évaluation des expressions booléennes dès lors que le résultat est connu.
    L'option de projet "Complete boolean eval" est toujours cochée par défaut sur mon Delphi 7, en tout cas...

    De plus, contrairement au C (pour lequel le langage impose une évaluation paresseuse, non modifiable), cela reste optionnel en Pascal (et en Delphi bien entendu), peu importe le réglage par défaut du compilateur.

    Et là règle habituelle veut que l'on présuppose que l'évaluation est complète, sinon tu as un paquet de sources plus ou moins anciens qui vont t'exploser à la tête assez rapidement...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #48
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    L'option de projet "Complete boolean eval" est toujours cochée par défaut sur mon Delphi 7, en tout cas...
    Ben justement, ça veut dire qu'il va faire une évaluation paresseuse .
    Sauf si tu coches la case pour le forcer à faire une évaluation complète.

  9. #49
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Ben justement, ça veut dire qu'il va faire une évaluation paresseuse .
    Bon, vu que je ne prends pas de drogue, va donc falloir que j'arrête de répondre sur les forums tard le soir, moi... Je l'ai "lu" dans l'autre sens, hier soir...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #50
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    L'option de projet "Complete boolean eval" est toujours cochée par défaut sur mon Delphi 7, en tout cas...
    +1
    à propos où est ninita dans tout sa???
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  11. #51
    Inactif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 182
    Points : 212
    Points
    212
    Par défaut Versions
    c'est la première version qui fait le moins de test
    et de plus elle profite du predicateur de brabchemen

    En Delphi les for sont compilés comme des repeat
    i/e le for est déplacé a la fin du traitement de manier a avoiur un saut arriere
    donc on a un jz +X
    Or le prédicateur ne prend pas les jz + il ne prends que les jz-
    P0our nous cela veut dire que le flux va considère le test comme faux e
    va pipeline le deuxième test
    Comme on a plus d'inégalité que d'égalité on va aller plus vite

    Boris
    Papy

    Nul ne pourra jamais vous empêchez d'être libre.

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/07/2011, 21h22
  2. Utilisation de l'instruction goto
    Par AbouZaid dans le forum PL/SQL
    Réponses: 6
    Dernier message: 19/05/2011, 13h51
  3. Instructions goto _label
    Par Klaine dans le forum C
    Réponses: 6
    Dernier message: 21/05/2008, 19h23
  4. [Débutant] Instruction goto
    Par feynman dans le forum Fortran
    Réponses: 6
    Dernier message: 11/09/2007, 17h18
  5. [CR10][Delphi] PB avec Instruction PrintReport
    Par coucoucmoi dans le forum SDK
    Réponses: 6
    Dernier message: 09/03/2005, 10h30

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