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

C Discussion :

Que pensez vous du goto [Débat]


Sujet :

C

  1. #21
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Bizarre je n’ai jamais utilisé de goto...
    Pourtant je code souvent...
    Alors on pourrait s'en passer ??
    A par dans de très très très rare cas...

  2. #22
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par ulukahio
    iagine ce que ça donne avec une centaine de champs, quand tous saufs le dernier ne sont pas présents.... tu marques un if avec cent tests dedans? Pas très lisible tout ça...
    Non, je revoie ma façon de codée

  3. #23
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Ti-R
    Bizarre je n’ai jamais utilisé de goto...
    Pourtant je code souvent...
    "Coder" .. ça ne veut rien dire ... tout dépend si tu fais du temps-réel critique (genre switch en bas de la ms avec un OS très performant) ou si tu fais des applications plus standard

    Alors on pourrait s'en passer ??
    A par dans de très très très rare cas...
    Dans la mesure du possible, oui, mais c'est un peu comme l'école qui refuse les "continue" dans les for
    - Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
    - Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
    JC Vandamme.

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par gege2061
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( ligne[i] == 2 )
    {  /* traitement du champ2 */ }
    else if ( lign[i] == 1 || ligne[i]==3 )
    { /* traitement du champ3 */ }
    else{ /* traitement du champ1 */}

    la même avec les switch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    switch( ligne[i] )
    {
      case 2:
        /* traitement du champ2 */
      break;
      case 1:
      case 3:
        /* traitement du champ3 */
      break;
      default:
        /* traitement du champ1 */
      break;
    }
    Si les sont peu utiliser c'est qu'ils sont facilement remplassable.
    sauf que pour mon programme ce switch marche mais est tres lourd à programmer... Pourquoi? Parcequ'il il faudrait que je l'écrive cent fois:

    En effet, la valeur de ligne [i] ne correspond pas au champ dans lequel se placer, mais au nombre de champs à sauter. Donc le case 3 peut m'emmener dans le champ 3 comme dans le champ 10, et il faudrait que je mette ce switch à chaque fois que je teste la valeur de ligne[i] avec un corps différent. Et du coup je vois pas ce que je gagne en lisibilité.

  5. #25
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Une autre piste pour ton problème, à condition que tes ligne[i] renvoit toujours des entiers:

    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
    main(...)
    {
    traitement_champs(ligne[i]);
     
    //....
    }
     
    void traitement_champs(int nombre)
    {
    switch(nombre)
      {
       case 1: // traitement champs 1
     
       case 2: // traitement champs 2
     
       case 3: // traitement champs 3
     
      default: // traitement divers...
      }
     
    }
    Bien sûr, tu modifies le type de retour "void" de la fonction en ce que tu aurais besoin de récupérer éventuellement...

    Enfin, c'est dur de proposer une solution sans avoir tous les tenants et les aboutissants du problème...
    C'est juste une piste...

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par gege2061
    Citation Envoyé par ulukahio
    iagine ce que ça donne avec une centaine de champs, quand tous saufs le dernier ne sont pas présents.... tu marques un if avec cent tests dedans? Pas très lisible tout ça...
    Non, je revoie ma façon de codée
    je ne demande que ça... Je ne suis absolument pas un programmeur né et je ne demande qu'à faire des progrès.

  7. #27
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par mat.M
    C'est vrai il faut éviter les goto mais parfois c'est bien utile .....
    Dans les exemples du SDK de Direct X il y a utilisation de quelques goto .
    Ils sont vraiment mauvais programmeurs alors chez M$
    Je suis d'accord que chez Micro$oft ils ne sont pas complètement nuls, mais quand même, ils pourraient faire quelques efforts :
    Tiré de MSDN
    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
    BOOL ProcessCmdLine(LPSTR lpCmdLine, LPDWORD pdwRegisterCF,
                   LPDWORD pdwRegisterActiveObject, int nCmdShow)
    {
       LPCLASSFACTORY pcf = NULL;
       HRESULT hr; 
       *pdwRegisterCF = 0;
       *pdwRegisterActiveObject = 0;
     
       // Expose class factory for application object if command line
       // contains the /Automation switch.
       if (_fstrstr(lpCmdLine, "-Automation") != NULL
          || _fstrstr(lpCmdLine, "/Automation") != NULL)
       {
          pcf = new CApplicationCF;
          if (!pcf)
             goto error;
          pcf->AddRef();
          hr = CoRegisterClassObject(CLSID_Lines, pcf,
                            CLSCTX_LOCAL_SERVER, REGCLS_SINGLEUSE,
                            pdwRegisterCF);
          if (hr != NOERROR)
             goto error;
          pcf->Release();
       }
       else            // Show window if started as stand-alone. 
       g_pApplication->ShowWindow(nCmdShow );
     
    // Register Lines Application object in the running object table 
    // (ROT). Use weak registration so that the ROT releases its reference
    // when all external references are released.
       RegisterActiveObject(g_pApplication, CLSID_Lines, ACTIVEOBJECT_WEAK,
             pdwRegisterActiveObject);
       return TRUE;
     
    error:
       if (pcf)
          pcf->Release();
       return FALSE;
    }
    Le goto est-il vraiment utile ici ??
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #28
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par ulukahio
    En effet, la valeur de ligne [i] ne correspond pas au champ dans lequel se placer, mais au nombre de champs à sauter.
    Peux-tu poster ton code de traitement de champs qu'on comprenne un peu plus ce que tu veux dire ?
    - Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
    - Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
    JC Vandamme.

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par calogerogigante
    Citation Envoyé par ulukahio
    Oui je suis d'accord avec toi, mais ce n'est pas dans ce type de circonstances que je compte utiliser goto.

    (on est à l'intérieur d'une boucle while qui lit une par une les lignes d'un fichier texte)

    Si quelqu'un pouvait me donner un code propre et sûr correspondant à celui ci:

    if (ligne[i]==2) //le chiffre correspond au nombre de champs non présents dans la base d'origine
    goto champ2;
    else if (ligne[i]==3)
    goto champ3;
    else{ //traitement du champ1}

    champ2: //traitement du champ2

    if (ligne[i]==1)
    goto champ3;

    champ3: //traitement du champ 3
    Là par contre, en effet, je trouve déjà l'utilisation du goto risquée... Très risquée...

    Plutôt d'accord avec les propositions des deux posts au-dessus de celui-ci...
    En quoi cette utilisaation est elle risquée? (par contre trap D, si on pouvait éviter de faire dévier le topic sur l'incapacité à programmer des gens de grosoft ça m'arrangerait )

  10. #30
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Trap D
    Tiré de MSDN
    Le goto est-il vraiment utile ici ??
    Effectivement dans ce cas, il est possible de faire une fonction mais je trouve que le programme est clair quant même. Je n'est pas mis plus de temps à comprendre le programme que s'il y avait eu une fonction. Contrairement au code de ulukahio.

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par DavG
    Citation Envoyé par ulukahio
    En effet, la valeur de ligne [i] ne correspond pas au champ dans lequel se placer, mais au nombre de champs à sauter.
    Peux-tu poster ton code de traitement de champs qu'on comprenne un peu plus ce que tu veux dire ?

    un exemple: le fichier original contient une centaine de champs présentés comme suit:
    Michel; Barnier; 21rue machin; c'est la fête
    mais si le premier champ n'est pas présent, on a:

    1; Barnier; 21rue machin; c'est la fête
    si le premier et le deuxième ne sont pas présents, on a:

    2; 21rue machin; c'est la fête
    Si le premier, le deuxieme et le troisieme ne sont pas présents:

    3; c'est la fête
    Si le deuxieme n'est pas présent:

    Michel; 1; 21rue machin; c'est la fête
    Si le deuxieme et le troisieme ne sont pas présents:

    Michel; 2; c'est la fête
    Et ainsi de suite...

  12. #32
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Au plus tu rajoutes de "petits jump" à saute mouton au-dessus de petits bouts de code, au plus tu risques de louper une étape logique du déroulement de ton code... Surtout si tu dis toi-même qu'il risque d'y avoir une centaine de traitements de champs...

    Je ne suis pas foncièrement contre, mais je trouve cela dangereux car tu risques de louper plus facilement une incohérence dans ton code...
    A moins d'être sûr de ce que tu fais à 100 % (exemple: t'as écrit un petit ordinogramme clair qui représente toutes les possibilités de cette partie de ton programme utilisant les gotos...), alors OK...

    Mais à mon avis: ordonner les choses clairement avec un switch, dans ton cas, serait beaucoup plus propre et plus lisible... Notamment en cours de déboguage...

  13. #33
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    il faut se rappeler que les instructions "return", "break", "continue"
    sont des "goto" déguisés et maîtrisés

    par contre il n'existe aucune instruction pour sortir élégamment de
    2 boucles imbriquées. à part "goto".

  14. #34
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut
    En fait, le pb pour éviter les goto est souvent un problème d'algo.
    Ne pourrais-tu pas mettre en place un code à base de pointeur ?
    1 -Tu fais pointer le pointeur sur le champ1,
    2 - tu récupères le nombre de champ à sauter,
    3 - tu incrémentes ton pointeur du nombre de champ correspondant
    4 - tu appelles mon_traitement (mon_pointeur) ?

    Bien sur ne connaissant pas ton code et ton traitement il n'est pas sûr que cela soit réalisable...

    Mais généralement il est fortement conseiller de mettre en place une solution sans goto (pourquoi ? .... Parce que.... )

  15. #35
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    le 'no goto ' me fait aussi penser à certaines personnes qui vont te dire de ne surtout pas utiliser le 'switch' parceque c'est pas compilé de maniére optimum, que le 'continue' dans un while n'est pas propre parceque tu ne respectes pas ta condition de sortie etc....

    n'empeche que un beau et magnifique goto bien placé et ben c'est tres propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    piVar = (int*) calloc(SIZE,sizeof(int));
    if(!piVar )
    goto labelError;
     
    /*traitement*/
     
    return 0;
    labelError:
    return -1;
    Si tu ne te plantes pas, comment veux tu pousser?

  16. #36
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par calogerogigante
    Au plus tu rajoutes de "petits jump" à saute mouton au-dessus de petits bouts de code, au plus tu risques de louper une étape logique du déroulement de ton code... Surtout si tu dis toi-même qu'il risque d'y avoir une centaine de traitements de champs...

    Je ne suis pas foncièrement contre, mais je trouve cela dangereux car tu risques de louper plus facilement une incohérence dans ton code...
    A moins d'être sûr de ce que tu fais à 100 % (exemple: t'as fait un petit organigramme clair qui resprésente toutes les possibilités de cette partie de ton programme utilisant les gotos...)

    A mon avis: ordonner les choses clairement avec un switch (dans ton cas) serait beaucoup plus propre et plus lisible..
    J'ai peut être un gros problème mais je ne vois pas de solutions simple avec un switch...
    PS: j'ai fait un organigramme clair, j'ai rajouté énormément de tests et j'ai beaucoup de temps pour le débuggage, et comme les noms des étiquettes que j'utiliserai seraient très explicites, le risque d'erreur me parait plutôt faible.

  17. #37
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 55
    Points : 62
    Points
    62
    Par défaut
    Le traitement des champs est-il toujours le même ?

  18. #38
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    le risque d'erreur me parait plutôt faible.
    Le propre de la programmation: c'est qu'il y a cent façons différentes de faire la même chose... T'es libre, malgré tout ce qu'on peut dire, de choisir ta méthode...

    N'empêche qu'en cas de problème... Ca peut devenir un casse-tête les gotos multipliés exagérement !!

    Mais au fond, l'important, c'est que ça tourne convenablement... Surtout si c'est pour un client...

    C'est mon avis, et je le partage !!
    ;-)

  19. #39
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Comment sont organisés ces fameux champs, ils sont nommés, numérotés ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  20. #40
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par jack69
    Le traitement des champs est-il toujours le même ?
    Non ce n'est jamais le même, et c'est bien là le problème, puisque je traite le contenu de chaque champ pour le formater selon les besoins de ma base d'arrivée.

    et calogerogigante heureusement que je suis libre, mais c'est juste que pour l'instant je ne vois pas de solutions qui ne rajoute pas environ 10 000 lignes de codes à mon problème dans ce que l'on me propose .

    (Merci à tous pour votre aide, je ne pensais pas que ce sujet déchainerai autant les passions)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 18 PremièrePremière 12345612 ... DernièreDernière

Discussions similaires

  1. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 10h17
  2. Que pensez vous de filemaker
    Par thpopeye dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 14/06/2007, 15h20
  3. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 15h45
  4. [Débat] Que pensez-vous des langages à typage dynamique?
    Par Eusebius dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 16/06/2004, 12h12
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 15h00

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