Précédent   Forum du club des développeurs et IT Pro > Le club des professionnels en informatique > La taverne du Club : Humour et divers > Humour Informatique
Humour Informatique Le Forum des meilleures anecdotes en humour informatique
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Actualité déjà publiée
 
Outils de la discussion
Publicité
'
Vieux 13/12/2012, 10h58   #101
ManusDei
Membre Expert
 
Avatar de ManusDei
 
Homme
esclave du Grand Capital
Inscription : février 2010
Messages : 1 075
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : esclave du Grand Capital

Informations forums :
Inscription : février 2010
Messages : 1 075
Points : 2 365
Points : 2 365
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
ManusDei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 11h05   #102
LooserBoy
Membre Expert
 
Avatar de LooserBoy
 
Homme Alexis Lechevalier
Ingénieur développement logiciels
Inscription : février 2005
Messages : 1 047
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 047
Points : 1 727
Points : 1 727
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...

"Les fumeurs meurent prématurément"
Puisqu'on dit que ce sont toujours les meilleurs qui s'en vont en premier...
LooserBoy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 11h10   #103
Bluedeep
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 6 555
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 52
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 6 555
Points : 13 939
Points : 13 939
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).
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 11h10   #104
shadowmoon
Membre Expert
 
Avatar de shadowmoon
 
Homme thomas
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 807
Détails du profil
Informations personnelles :
Nom : Homme thomas
Âge : 31
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 807
Points : 1 261
Points : 1 261
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, les derniers recours sont testdisk et le formatage bas-niveau

pour faire le menage efficacement sur vos DD, utilisez Ccleaner
shadowmoon est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 11h16   #105
ManusDei
Membre Expert
 
Avatar de ManusDei
 
Homme
esclave du Grand Capital
Inscription : février 2010
Messages : 1 075
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : esclave du Grand Capital

Informations forums :
Inscription : février 2010
Messages : 1 075
Points : 2 365
Points : 2 365
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
ManusDei est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 12h00   #106
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 661
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 661
Points : 2 790
Points : 2 790
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
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 13h35   #107
Troudhyl
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 972
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France

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

Informations forums :
Inscription : mai 2009
Messages : 972
Points : 1 702
Points : 1 702
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)
Troudhyl est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/12/2012, 13h45   #108
rt15
Membre éprouvé
 
Avatar de rt15
 
Homme
Développeur informatique
Inscription : octobre 2005
Messages : 203
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2005
Messages : 203
Points : 435
Points : 435
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
rt15 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 13h51   #109
BenoitM
Expert Confirmé
 
Homme Benoît
Inscription : février 2003
Messages : 1 661
Détails du profil
Informations personnelles :
Nom : Homme Benoît
Âge : 32
Localisation : Belgique

Informations forums :
Inscription : février 2003
Messages : 1 661
Points : 2 790
Points : 2 790
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
BenoitM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 14h14   #110
Lung
Membre Expert
 
Avatar de Lung
 
Analyste-programmeur
Inscription : mai 2002
Messages : 2 140
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Yonne (Bourgogne)

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

Informations forums :
Inscription : mai 2002
Messages : 2 140
Points : 2 358
Points : 2 358
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
Win XP Pro - OpenGL 2.1 - Oracle 11g - Firebird 2.5.0.2
Écrivez dans un français correct !!
Lung est déconnecté   Envoyer un message privé Réponse avec citation 50
Vieux 14/12/2012, 10h02   #111
Glob
Membre éprouvé
 
Avatar de Glob
 
Inscription : avril 2002
Messages : 405
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : avril 2002
Messages : 405
Points : 442
Points : 442
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!
Brutes 1, 2 et 3!
Glob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 10h13   #112
Uther
Expert Confirmé Sénior
 
Avatar de Uther
 
Homme
Inscription : avril 2002
Messages : 2 678
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : avril 2002
Messages : 2 678
Points : 5 107
Points : 5 107
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.
Uther est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 11h23   #113
Deaf
Membre émérite
 
Inscription : mars 2006
Messages : 799
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : mars 2006
Messages : 799
Points : 865
Points : 865
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.
Deaf est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 14/12/2012, 11h59   #114
bilbonec
Membre éclairé
 
Inscription : avril 2004
Messages : 391
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 391
Points : 372
Points : 372
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 !
bilbonec est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/12/2012, 12h05   #115
Bluedeep
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 6 555
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 52
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 6 555
Points : 13 939
Points : 13 939
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).
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 14/12/2012, 12h08   #116
Rayek
Modérateur
 
Avatar de Rayek
 
Homme
Développeur informatique
Inscription : mars 2005
Messages : 4 998
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
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 : 4 998
Points : 7 742
Points : 7 742
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
Rayek est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/12/2012, 15h27   #117
Freem
Expert Confirmé
 
Homme
Développeur informatique
Inscription : décembre 2008
Messages : 777
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2008
Messages : 777
Points : 2 812
Points : 2 812
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

Citation:
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!!!
Freem est déconnecté   Envoyer un message privé Réponse avec citation 12
Vieux 14/12/2012, 16h26   #118
Loceka
Expert Confirmé
 
Avatar de Loceka
 
Tlouye Ci
Inscription : mars 2004
Messages : 1 807
Détails du profil
Informations personnelles :
Nom : Tlouye Ci

Informations forums :
Inscription : mars 2004
Messages : 1 807
Points : 2 937
Points : 2 937
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).
Loceka est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/12/2012, 17h42   #119
Aurélien LEQUOY
Membre du Club
 
Aurélien LEQUOY
Inscription : février 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Aurélien LEQUOY

Informations forums :
Inscription : février 2011
Messages : 63
Points : 49
Points : 49
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
Aurélien LEQUOY est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 14/12/2012, 17h43   #120
Aurélien LEQUOY
Membre du Club
 
Aurélien LEQUOY
Inscription : février 2011
Messages : 63
Détails du profil
Informations personnelles :
Nom : Aurélien LEQUOY

Informations forums :
Inscription : février 2011
Messages : 63
Points : 49
Points : 49
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
Aurélien LEQUOY est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Actualité déjà publiée
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h22.


 
 
 
 
Partenaires

Hébergement Web