Publicité
+ Répondre à la discussion Actualité déjà publiée
Page 6 sur 10 PremièrePremière ... 2345678910 DernièreDernière
Affichage des résultats 101 à 120 sur 185
  1. #101
    Expert Confirmé Avatar de ManusDei
    Homme Profil pro
    esclave du Grand Capital
    Inscrit en
    février 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : esclave du Grand Capital

    Informations forums :
    Inscription : février 2010
    Messages : 1 278
    Points : 2 913
    Points
    2 913

    Par défaut

    Je me dis que vous aurez peut-être une solution pour un cas rencontré dans un stage où j'ai rien trouvé d'autre qu'un GOTO.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While(un_test){
      //section a de code
      if(machin) GOTO label;
      //section b de code
    } end while
    //section c de code
    label :
    //section d de code
    Le if est au milieu du while, si vrai on part sur le code après le label.
    Si on sort du while normalement, on exécute la section c avant d'exécuter la section d.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  2. #102
    Membre Expert Avatar de LooserBoy
    Homme Profil pro Alexis Lechevalier
    Ingénieur développement logiciels
    Inscrit en
    février 2005
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Nom : Homme Alexis Lechevalier
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2005
    Messages : 1 083
    Points : 1 868
    Points
    1 868

    Par défaut

    Citation Envoyé par ManusDei Voir le message
    Je me dis que vous aurez peut-être une solution pour un cas rencontré dans un stage où j'ai rien trouvé d'autre qu'un GOTO.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While(un_test){
      //section a de code
      if(machin) GOTO label;
      //section b de code
    } end while
    //section c de code
    label :
    //section d de code
    Comme ça?
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    While(un_test){
      //section a de code
      if(machin)
      {
         //section d de code
      }
      //section b de code
    } end while
    //section c de code
    Vu sur un paquet de cigarettes: "Fumer peut entrainer une mort lente et douloureuse"
    - Vivre aussi... Ce n'est pas forcément moins douloureux et c'est même beaucoup plus lent...

  3. #103
    Inactif
    Homme Profil pro François
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 608
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 608
    Points : 13 112
    Points
    13 112

    Par défaut

    Ouais .... un flag de plus dans le corps de méthode n'aurait pas changé la face du monde, je ne vois pas trop la nécessité du goto en l'espèce.
    (surtout avec un branchement depuis un point unique).

  4. #104
    Membre Expert Avatar de shadowmoon
    Homme Profil pro thomas
    Ingénieur études et développement .Net C#
    Inscrit en
    mai 2005
    Messages
    888
    Détails du profil
    Informations personnelles :
    Nom : Homme thomas
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur études et développement .Net C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2005
    Messages : 888
    Points : 1 403
    Points
    1 403

    Par défaut

    Citation Envoyé par LooserBoy Voir le message
    Comme ça?
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    While(un_test){
      //section a de code
      if(machin)
      {
         //section d de code
      }
      //section b de code
    } end while
    //section c de code
    Non ce n'est pas équivalent, car, avec cette version du code

    1) on ne sort pas de la boucle while au moment du if
    2) les sections b et c sont quand même exécutées au lieu d’être ignorées, "sautées"

    Je peux me tromper, mais si j'ai bien compris, je pense qu'il faudrait plutôt faire comme ça

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    While(un_test)
    {
      //section a de code
    
      if(machin)
      {
         //section d de code
      }
    
       else
       {
          //section b de code
       }
    } end while
    
    if not (machin)
    {
        //section c de code
        //section d de code
    }
    il n'y a jamais eu qu'un seul chrétien et il est mort sur la croix Friedrich Nietzsche
    L'homme est un apprenti, la douleur est son maitre Alfred de Musset

    pour les problèmes de partition et de données, les derniers recours sont testdisk et le formatage bas-niveau
    pour faire le menage efficacement sur vos DD, utilisez Ccleaner

    my best memories ever : 2008 London Circle Line "The Booze Train"

  5. #105
    Expert Confirmé Avatar de ManusDei
    Homme Profil pro
    esclave du Grand Capital
    Inscrit en
    février 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : esclave du Grand Capital

    Informations forums :
    Inscription : février 2010
    Messages : 1 278
    Points : 2 913
    Points
    2 913

    Par défaut

    Citation Envoyé par shadowmoon Voir le message
    1) on ne sort pas de la boucle while au moment du if
    2) les sections b et c sont quand même exécutées au lieu d’être ignorées, "sautées"
    Et la section d du code n'est pas exécutée après la section c si on sort du while normalement (sans passer par le GOTO).
    Il y avait des variables communes dans les 4 sections, donc impossible de changer l'ordre dans lequel elles sont exécutées.

    @shadowmoon : Oui, en rajoutant une section d du code après la section c dans le if(not machin)
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  6. #106
    Expert Confirmé
    Homme Profil pro Benoît
    Inscrit en
    février 2003
    Messages
    1 738
    Détails du profil
    Informations personnelles :
    Nom : Homme Benoît
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : février 2003
    Messages : 1 738
    Points : 2 908
    Points
    2 908

    Par défaut

    euh faut remplacer le goto par un break sinon vous n'aurez pas le même comportement non?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  7. #107
    Modérateur

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2009
    Messages
    1 007
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2009
    Messages : 1 007
    Points : 1 701
    Points
    1 701

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool continuer = true;
    While(un_test && continuer){
      //section a de code
      if(machin) {
        continuer = false;
      } else {
         //section b de code
      }
    } end while
    if (continuer) {
      //section c de code
    }
    //section d de code
    Version avec le break :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    While(un_test){
      //section a de code
      if(machin)
        break;
      //section b de code
    } end while
    if (!un_test) {
      //section c de code
    }
    //section d de code
    (si la section a ne peut pas changer un_test)

  8. #108
    Membre éprouvé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    octobre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : octobre 2005
    Messages : 214
    Points : 476
    Points
    476

    Par défaut

    Citation Envoyé par shadowmoon Voir le message
    Je peux me tromper, mais si j'ai bien compris, je pense qu'il faudrait plutôt faire comme ça

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    While(un_test)
    {
      //section a de code
    
      if(machin)
      {
         //section d de code
      }
    
       else
       {
          //section b de code
       }
    } end while
    
    if not (machin)
    {
        //section c de code
        //section d de code
    }
    Il manque aussi le break, et le code "section d" est dupliqué, ce qui est aussi souvent considéré comme une très mauvaise pratique car ça gène le refactoring et la maintenance du code.

    Il faut qu'on retourne tous à l'école !

    Enième proposition :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    execute_c = true;
    While(un_test){
      //section a de code
      if(machin)
      {
        execute_c = false;
        break;
      }
      //section b de code
    } end while
    if (execute_c)
    {
      //section c de code
    }
    
    //section d de code

  9. #109
    Expert Confirmé
    Homme Profil pro Benoît
    Inscrit en
    février 2003
    Messages
    1 738
    Détails du profil
    Informations personnelles :
    Nom : Homme Benoît
    Âge : 33
    Localisation : Belgique

    Informations forums :
    Inscription : février 2003
    Messages : 1 738
    Points : 2 908
    Points
    2 908

    Par défaut

    La solution de Troudhyl me semble correct
    (j'avais la flamme d'écrire le pseudo code )
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  10. #110
    Expert Confirmé Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    mai 2002
    Messages
    2 270
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2002
    Messages : 2 270
    Points : 2 996
    Points
    2 996

    Par défaut

    Citation Envoyé par BenoitM Voir le message
    (j'avais la flamme d'écrire le pseudo code )
    Te brûle pas !

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
    ______________________________________________________________________________________________________________________________________________________________

    Delphi 6#2 Entreprise - Delphi 2010 Architecte - Delphi XE2 Entreprise - Visual studio 2003
    Win XP Pro - OpenGL 2.1 - Oracle 10g - Firebird 2.5.0.2
    Écrivez dans un français correct !!

  11. #111
    Membre expérimenté
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    avril 2002
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : avril 2002
    Messages : 406
    Points : 560
    Points
    560

    Par défaut

    Citation Envoyé par Uther Voir le message
    Le problème des getter/setter n'a rien a voir avec l'introspection, ou la lisibilité, c'est même plutôt une plaie à ce niveau.

    Ils sont là car ils servent d'interface aux javabean. Un bean se doit d'offrir une encapsulation forte. Grâce au getter/setter les beans ont un contrôle complet sur leur propriétés qu'il peuvent restreindre (read/write only), vérifier, générer à la voler, ... etc
    Certes c'est lourd de faire un getter/setter quand on ne fait qu'une opération d'écriture/lecture de variable (Sun/Oracle devrait vraiment se pencher sur une syntaxe spéciale pour les propriétés). Mais ça permet de pouvoir faire évoluer l'opération dans le futur pour par exemple ajouter un contrôle sur un setter, ce qui n'est pas possible avec un accès direct à un champ.
    Je parle de DTO, pas de javabeans. De simples containers dont l'équivalent en C serait le struct. Je ne vois toujours pas le moindre petit début de pertinence à y mettre des accessors.
    cf Java Coding Conventions 10.1
    Glob
    All Hell Can't Stop Us Now!

  12. #112
    Expert Confirmé Sénior Avatar de Uther
    Homme Profil pro
    Inscrit en
    avril 2002
    Messages
    3 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2002
    Messages : 3 071
    Points : 6 746
    Points
    6 746

    Par défaut

    Pour les DTO en effet ça ne sert à rien.

    C'est un exemple typique de bonne pratique dans un cas particulier (objet offrant une forte encapsulation) qui a été enseignée par certains comme un dogme absolu, généralement par fainéantise d'expliquer le pourquoi du comment.
    Du coup des gens veulent les étendre à des domaines ou elles sont contreproductives.

  13. #113
    Membre Expert
    Inscrit en
    mars 2006
    Messages
    841
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : mars 2006
    Messages : 841
    Points : 1 041
    Points
    1 041

    Par défaut

    Citation Envoyé par Glob Voir le message
    Je parle de DTO, pas de javabeans. De simples containers dont l'équivalent en C serait le struct. Je ne vois toujours pas le moindre petit début de pertinence à y mettre des accessors.
    cf Java Coding Conventions 10.1
    On peut imaginer une classe qui étend le DTO pour y ajouter une logique métier, tout en restant utilisable comme un DTO par la plupart des autres classes.
    Dans ce cas, si tu utilise directement les champs, tu peux zapper la logique métier. Pour moi, les getters/setters permettent de laisser ce genre de portes ouvertes, même si on en a pas besoin, a priori.

  14. #114
    Membre éclairé
    Inscrit en
    avril 2004
    Messages
    396
    Détails du profil
    Informations forums :
    Inscription : avril 2004
    Messages : 396
    Points : 379
    Points
    379

    Par défaut

    La pire règle de codage est encore de n'en imposer aucune.

    C'est ce qui m'arrive dans ma mission actuelle où, après avoir développé seul pendant quelques mois, un autre développeur se met au freestyle : différentes indentations par fichiers, différentes façons de présenter les {}, nommage complètement différent des méthodes / variables, etc.

    Et là, on se dit que dans les normes de codage ... il y a du bon !

  15. #115
    Inactif
    Homme Profil pro François
    Chef de projet NTIC
    Inscrit en
    janvier 2007
    Messages
    6 608
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : janvier 2007
    Messages : 6 608
    Points : 13 112
    Points
    13 112

    Par défaut

    Citation Envoyé par bilbonec Voir le message
    La pire règle de codage est encore de n'en imposer aucune.

    C'est ce qui m'arrive dans ma mission actuelle où, après avoir développé seul pendant quelques mois, un autre développeur se met au freestyle : différentes indentations par fichiers, différentes façons de présenter les {}, nommage complètement différent des méthodes / variables, etc. !
    Dans la mesure où tu es là depuis quelques mois, ce n'est quand même pas difficile de lui imposer tes normes de codage. En bonne logique ta hiérarchie devrait te soutenir (sauf su tu n'insistes pas, bien sur).

  16. #116
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2005
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 5 195
    Points : 8 202
    Points
    8 202

    Par défaut

    Citation Envoyé par bilbonec Voir le message
    Et là, on se dit que dans les normes de codage ... il y a du bon !
    Enfin bon, il y a des limites, dans la boite où je suis on a passé un fois 2 heures à discuter pour savoir où l'on met le begin dans un case (pour ma part j'étais plutôt en mode on s'en fou tant que ça reste lisible)

    et ça pinaillait entre

    Code delphi :
    1
    2
    3
    4
    5
    6
    7
    8
     
    Case XXX of
    1 : begin
      // cas 1
    end;
    2 : begin
      // cas 2
    end;

    et

    Code delphi :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Case XXX of
    1 :
      begin
        // cas 1
      end;
    2 :
      begin
        // cas 2
      end;
    end;
    Modérateur Delphi Combattez la brute
    Aucune réponse aux sollicitations techniques par MP

    Le guide du bon forumeur :
    __________
    [Projet en cours] Des unités pour faciliter l'utilisation d'indy : EasyIndy 1.3

  17. #117
    Expert Confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2008
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : décembre 2008
    Messages : 805
    Points : 2 650
    Points
    2 650

    Par défaut

    Citation Envoyé par rt15 Voir le message
    3 fois le même programme, qui copie le contenu d'un fichier vers un autre fichier :

    Sans goto, traitement normal en premier :
    Code C :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (lpInputFile)
      {
        /* Open output file */
        lpOutputFile = fopen("output.txt", "wb");
        if (lpOutputFile)
        {
          /* Retrieve size of the file */
          fseek(lpInputFile, 0, SEEK_END);
          nSize = ftell(lpInputFile);
          fseek(lpInputFile, 0, SEEK_SET);
     
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          if (lpBuffer)
          {
            /* Read from input file to buffer */
            if (fread(lpBuffer, 1, nSize, lpInputFile) == nSize)
            {
              /* Write from buffer to output file */
              if (fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize)
              {
                 nRes = 0;
              }
              else
              {
                perror("Failed to write to output file");
              }
            }
            else
            {
              perror("Failed to read input file");
            }
            free(lpBuffer);
          }
          else
          {
            perror("Failed to allocate buffer");
          }
          fclose(lpOutputFile);
        }
        else
        {
          perror("Failed to open output file");
        }
        fclose(lpInputFile);
      }
      else
      {
        perror("Failed to open input file");
      }
      return nRes;
    }

    Sans goto, traitement d'erreur en premier :
    Code C :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (!lpInputFile)
      {
        perror("Failed to open input file");
      }
      else
      {
        /* Open output file */
        lpOutputFile = fopen("output.txt", "wb");
        if (!lpOutputFile)
        {
          perror("Failed to open output file");
        }
        else
        {
          /* Retrieve size of the file */
          fseek(lpInputFile, 0, SEEK_END);
          nSize = ftell(lpInputFile);
          fseek(lpInputFile, 0, SEEK_SET);
     
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          if (!lpBuffer)
          {
            perror("Failed to allocate buffer");
          }
          else
          {
            /* Read from input file to buffer */
            if (fread(lpBuffer, 1, nSize, lpInputFile) != nSize)
            {
              perror("Failed to read input file");
            }
            else
            {
              /* Write from buffer to output file */
              if (fwrite(lpBuffer, 1, nSize, lpOutputFile) != nSize)
              {
                perror("Failed to write to output file");
              }
              else
              {
                nRes = 0;
              }
            }
            free(lpBuffer);
          }
          fclose(lpOutputFile);
        }
        fclose(lpInputFile);
      }
     
      return nRes;
    }


    Avec goto :
    Code C :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (!lpInputFile)
      {
        perror("Failed to open input file");
        goto the_end;
      }
     
      /* Open output file */
      lpOutputFile = fopen("output.txt", "wb");
      if (!lpOutputFile)
      {
        perror("Failed to open output file");
        goto close_input_file;
      }
     
      /* Retrieve size of the file */
      fseek(lpInputFile, 0, SEEK_END);
      nSize = ftell(lpInputFile);
      fseek(lpInputFile, 0, SEEK_SET);
     
      /* Allocate a buffer to store input file content */
      lpBuffer = (char*)malloc(nSize);
      if (!lpBuffer)
      {
        perror("Failed to allocate buffer");
        goto close_output_file;
      }
     
      /* Read from input file to buffer */
      if (fread(lpBuffer, 1, nSize, lpInputFile) != nSize)
      {
        perror("Failed to read input file");
        goto free_buffer;
      }
     
      /* Write from buffer to output file */
      if (fwrite(lpBuffer, 1, nSize, lpOutputFile) != nSize)
      {
        perror("Failed to write to output file");
        goto free_buffer;
      }
     
      nRes = 0;
     
    free_buffer:
      free(lpBuffer);
    close_output_file:
      fclose(lpOutputFile);
    close_input_file:
      fclose(lpInputFile);
    the_end:
      return nRes;
    }

    Franchement, avec la première solution, il est très difficile de vérifier que les ressources sont fermées correctement. Et la deuxième me semble moins lisible que la troisième, mais c'est un peu subjectif peut être.

    Et pour rappel, Linux est bourré de goto...

    Refaisons les mêmes codes proprement:

    Sans goto, traitement normal en premier :
    Code C :
    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    BOOLEAN printError(BOOLEAN condition, char *errorText)
    {
    	if(FALSE==condition)
    		perror(errorText);
    	return condition;
    }
     
    int main()
    {
      char* lpBuffer;
      FILE* lpInputFile;
      FILE* lpOutputFile;
      int nSize;
      int nRes;
     
      nRes = 1;
     
      /* Open input file */
      lpInputFile = fopen("input.txt", "rb");
      if (printError(lpInputFile,"Failed to open input file"))
      {
        /* Open output file */
        lpOutputFile = fopen("output.txt", "wb");
        if (printError(lpOutputFile,"Failed to open output file"))
        {
          /* Retrieve size of the file*/
    	  fseek(lpInputFile, 0, SEEK_END);
    	  nSize = ftell(lpInputFile);
    	  fseek(lpInputFile, 0, SEEK_SET);
     
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          if (printError(lpBuffer,"Failed to allocate buffer"))
            /* Read from input file to buffer */
            if (printError(fread(lpBuffer, 1, nSize, lpInputFile) == nSize,"Failed to read input file"))
              /* Write from buffer to output file */
              nRes= printError(fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize,"Failed to write to output file");
            free(lpBuffer);
          fclose(lpOutputFile);
        }
        fclose(lpInputFile);
      }
      return nRes;
    }

    A noter qu'en fait, on peut améliorer le truc encore...
    Par exemple, enlever des if:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          /* Allocate a buffer to store input file content */
          lpBuffer = (char*)malloc(nSize);
          nRes=
    		printError(lpBuffer,"Failed to allocate buffer") &&
            /* Read from input file to buffer */
    		printError(fread(lpBuffer, 1, nSize, lpInputFile) == nSize,"Failed to read input file") &&
            /* Write from buffer to output file */
            printError(fwrite(lpBuffer, 1, nSize, lpOutputFile) == nSize,"Failed to write to output file");
          free(lpBuffer); /* no use to check: no problem if free is null */
          fclose(lpOutputFile);
    L'astuce: les && permettent d'agir comme un if en fait. Astuce apprise grâce au shell: si la première condition est fausse, alors l'ensemble de la condition sera fausse, donc le compilateur intelligent ne prendra pas la peine de vérifier les autres conditions

    Sans goto, traitement d'erreur en premier :
    Ouai mais en fait, flemme de refaire la même astuce que précédemment.

    Résultat final: 19 lignes de gagnées (28.4% de taille de code en moins tout de même, presque 1/3!), moins d'indentations, pas de goto et un code globalement plus clair.
    Problème: coût d'appel à la fonction printError(int, char*) à chaque fois, qui peut être résolu via des macros, d'ailleurs. Ou le mot-clé inline en C++, mais j'ai tenu à respecter le langage C au maximum de mes souvenirs.

    On peut améliorer encore plus le truc, en utilisant:
    _ des constantes pour les messages d'erreur
    _ une macro pour remplacer le if, qui prenne en paramètre le message d'erreur.



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    While(un_test){
      //section a de code
      if(machin) GOTO label;
      //section b de code
    } end while
    //section c de code
    label :
    //section d de
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void monBloc(void)
    {
      static int flag=0;
      if(0 == flag)
      {
        ;//section d de code
        flag=1;
      }
    }
    
    While(un_test)
    {
      //section a de code
      if(machin)
      {
        monBloc();
        break;
      }
      //section b de code
    } end while
    //section c de code
    
    monBloc();
    Sinon:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void machin(bool condition)
    {
      //section d
    }
    
    bool boucle()
    {
      While(un_test){
        //section a de code
        if(machin) return;
        //section b de code
      } 
      //section c de code
    }
    
    main()
    {
      boucle();
      machin();
    }
    Les solutions, s'pas ce qui manque.

    Ah oui, je viens de me rappeler une horreur, vue par un prof:

    Code java :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fonction()
    {// debut fonction
      if()
      { // début if
        for(;;) 
        { //debut for
        } // fin for
      } // fin if
    }// fin fonction
    Arrgg!g!!!

  18. #118
    Expert Confirmé Sénior Avatar de Loceka
    Profil pro Tlouye Ci
    Inscrit en
    mars 2004
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Nom : Tlouye Ci

    Informations forums :
    Inscription : mars 2004
    Messages : 2 048
    Points : 4 054
    Points
    4 054

    Par défaut

    Citation Envoyé par Freem Voir le message
    L'astuce: les && permettent d'agir comme un if en fait. Astuce apprise grâce au shell: si la première condition est fausse, alors l'ensemble de la condition sera fausse, donc le compilateur intelligent ne prendra pas la peine de vérifier les autres conditions
    C'est effectivement le principe de l'évaluation paresseuse. Par contre, étant donné que c'est une optimisation du langage, tous les langages ne la pratiquent pas.

    Par exemple en shell (/bin/sh), il me semble bien que la commande test (ou son équivalent [ ... ]) ne pratique pas l'évaluation paresseuse (c'est d'ailleurs ce que confirme ce site).

  19. #119
    Membre actif
    Homme Profil pro Aurélien LEQUOY
    Directeur technique
    Inscrit en
    février 2011
    Messages
    139
    Détails du profil
    Informations personnelles :
    Nom : Homme Aurélien LEQUOY
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : février 2011
    Messages : 139
    Points : 152
    Points
    152

    Par défaut

    Citation Envoyé par Bovino Voir le message
    Ne pas avoir le droit de créer de nouvelle base de donnée pour des activités différentes !

    Imaginons par exemple que nous ayons créé une base correspondant à des recettes de cuisine, avec les champs "ingrédients", "durée" et "opérations".
    On décide ensuite de créer un planning d'entrainement sportif, du coup, dans ce cas, "ingrédients" correspond à "type d'exercice", "durée" à "lieu" et "opérations" à "équipement". Seulement, comme il manque un champ pour "durée de l'exercice", alors on va utiliser le champ "ingrédients" en séparant la valeur "type d'exercice" et "durée de l'exercice" par un délimiteur arbitraire...

    Tout cela est parfaitement résumé dans cet article...

    tu travaillais chez doctissimo ? :p

  20. #120
    Membre actif
    Homme Profil pro Aurélien LEQUOY
    Directeur technique
    Inscrit en
    février 2011
    Messages
    139
    Détails du profil
    Informations personnelles :
    Nom : Homme Aurélien LEQUOY
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Transports

    Informations forums :
    Inscription : février 2011
    Messages : 139
    Points : 152
    Points
    152

    Par défaut

    Citation Envoyé par Uther Voir le message
    Non seulement :
    - le code que tu accuses d'être faux est tout à fait correct : fopen ne retourne NULL(soit 0) qu'en cas d'erreur. Si tu ne me crois pas, il suffit de consulter le man
    - la solution que tu proposes est incorrecte. Ton code ne gèrera pas les erreurs.

    Tout a fait d'accords que ce soit en C ou en PHP

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •