30

Lu trop vite, je pense grin

La structure, c'est { for () { if () { return } } return } ^^
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

31

Oui mais justement, pourquoi un goto au lieu d'une paire d'accolades pour ton if ?
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

32

Tu veux dire imbriquer tout l'autre code à l'intérieur du if ? C'est un peu gore, non ? grin
public static string DoubleQuotes(string text, char quote) { int i; for (i = 0; i < text.Length; ++i) { if (text[i] == quote) { var sb = new StringBuilder(text.Length + 2); // Chiffre magique pris presque au pif en espérant que ça marche bien la plupart du temps sb.Append(text, 0, ++i).Append(quote); int start = i; for (; i < text.Length; ++i) if (text[i] == quote) sb.Append(text, start, -start + (start = i + 1)).Append(quote); if (i > start) sb.Append(text, start, i - start); return sb.ToString(); } } return text; }Comme ça ?
C'est vrai qu'ici ça passerait, mais je suis pas sûr que ce soit plus lisible tongue

(Pour la lisibilité, je pense surtout aux deux for imbriqués)
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

33

Tu peux aussi faire un break à la place du goto et mettre une condition sur i à la suite de la boucle.
avatar

34

Oui, comme ça. Ça me paraît bien plus lisible qu'un goto, d'autant plus que tous les IDEs supportent le code folding maintenant smile
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

35

./33 > Ouais mais je suis pas fan d'ajouter du code pour tester quelque chose que je sais déjà. Le but ici est justement d'éviter ça. tongue
./34 > Mouais grin
Après franchement j'ai plusieurs cas avec une variable d'état en plus (donc plusieurs conditions d'entrée dans la seconde partie) où tu ne peux pas faire ça. (Mais ça marche toujours avec deux méthodes par contre)
Quitte à choisir, je préfère séparer en deux méthodes, comme ça la première peut potentiellement être inlinée si elle est estimée suffisamment petite.
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

36

J'ai pas lu trop vite mais je me suis gouré en écrivant mon truc, certes grin
Je voulais dire la même chose que Zerosquare en fait. Je ne vois pas du tout ce qu'il y a de gore. Et si vraiment le contenu du IF te semble trop long et utilisable ailleurs, une fonction est la bienvenue en effet.

La version avec goto ne me dérange pas, mais je trouve ça plutôt exotique et je ne trouve pas que ça se justifie au delà d'une préférence personnelle.
L'exemple classique de cas utile du goto est la gestion des erreurs, mais pour ça il y a les exceptions, et franchement le try/catch/finally fonctionne pas mal.

Perso il m'est déjà arrivé de regretter l'absence du goto, mais ça se compte sur les doigts d'une main.
Généralement c'est le cas d'un petit bout de code d'initialisation qui tente un truc et qui essaie une seconde fois avec un paramétrage très légèrement différent si la première tentative échoue.
J'ai dû faire une boucle peu lisible, et j'ai regretté.

37

Quelques utilisations de goto dans mes logiciels:

Backgammon:
      if (numlegalfullmoves) return numlegalfullmoves; else {
        // if possible, the HIGHER die must be played
        if (!numlegaldie1moves) goto die2;
        if (!numlegaldie2moves) goto die1;
        if (abs(die2)>abs(die1)) goto die2;
        die1: // play die1
          for (unsigned short i=0;i<numlegaldie1moves;i++) {
            legalmoves[i][0]=legaldie1moves[i];
            legalmoves[i][3]=legalmoves[i][2]=legalmoves[i][1]=-128;
          }
          return numlegaldie1moves;
        die2: // play die2
          for (unsigned short i=0;i<numlegaldie2moves;i++) {
            legalmoves[i][1]=legaldie2moves[i];
            legalmoves[i][3]=legalmoves[i][2]=legalmoves[i][0]=-128;
          }
          return numlegaldie2moves;
      }

(Et il y a 41 gotos en total dans Backgammon.) L'algorithme ci-dessus est aussi la manière la plus efficace de tester si une année est bissextile ou non:
if (x&3) goto notleapyear;
if (x%100) goto leapyear;
if (x%400) goto notleapyear;
leapyear:


KTIGCC:
  if (CURRENT_VIEW && CURRENT_VIEW->hasFocus()) {
    switch (index) {
      case 0: editUndo(); break;
      case 1: editRedo(); break;
      case 2: editCut(); break;
      case 3: editCopy(); break;
      case 4: editPaste(); break;
      case 5: // F1 context help
      {
        int line,col,i;
        CURRENT_VIEW->cursorPosition().position(line,col);
        QString textLine=CURRENT_VIEW->document()->line(line);
        QString wordUnderCursor;
        for (i=col-1;i>=0;i--) {
          QChar c=textLine[i];
          if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9')
              || c=='_' || c=='$' || c=='#')
            wordUnderCursor.prepend(c);
        }
        int len=textLine.length();
        for (i=col;i<len;i++) {
          QChar c=textLine[i];
          if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9')
              || c=='_' || c=='$' || c=='#')
            wordUnderCursor.append(c);
        }
        // always open at least the index
        force_qt_assistant_page(1);
        assistant->openAssistant();
        if (wordUnderCursor.isEmpty()) return;
        QString docFile=lookup_doc_keyword(wordUnderCursor);
        if (docFile.isEmpty()) return;
        // wait for Qt Assistant to actually open
        while (!assistant->isOpen())
          QCoreApplication::processEvents(QEventLoop::ExcludeUserInput,1000);
        assistant->showPage(QString(tigcc_base)+QString("/doc/html/")+docFile);
        break;
      }
      case 6:
      case 7:
        // keyReturn is not in any interface, but it's a public slot...
        CURRENT_VIEW->qt_metacall(QMetaObject::InvokeMetaMethod,
          CURRENT_VIEW->metaObject()->indexOfMethod("keyReturn()"),NULL);
        current_view_newLineHook();
        break;
      case 8:
        new TemplatePopup(CURRENT_VIEW);
        break;
      case 9:
      case 10:
        if (IS_FILE(currentListItem)
            && CURRENT_VIEW==static_cast<ListViewFile *>(currentListItem)->kateView) {
          QString fileText=CURRENT_VIEW->document()->text();
          CATEGORY_OF(category,currentListItem);
          // Completion only operates on C files.
          if (category==cFilesListItem || category==qllFilesListItem
              || (category==hFilesListItem && !fileText.isEmpty()
                  && fileText[0]!='|' && fileText[0]!=';')) {
            // Disable newLineHook.
            shortcuts[6]->setEnabled(FALSE);
            shortcuts[7]->setEnabled(FALSE);
            new CompletionPopup(CURRENT_VIEW,pathInProject(currentListItem),this,this);
          }
        }
        break;
      case 11: // next file
      case 12:
      case_11:
      {
        Q3ListViewItem *item=currentListItem;
        if (!item) item=rootListItem;
        Q3ListViewItem *origItem=item;
        do {
          item=item->itemBelow();
          if (!item) item=rootListItem;
          if (item==origItem) return; // no suitable items to select
        } while (item==rootListItem || IS_CATEGORY(item));
        fileTreeClicked(item);
        if (CURRENT_VIEW) CURRENT_VIEW->setFocus();
        break;
      }
      case 13: // switch transfer target
      case 14:
      case_13:
      {
        preferences.linkTarget=(preferences.linkTarget==LT_TIEMU)?LT_REALCALC:LT_TIEMU;
        savePreferences();
        // Apply the preferences to the debug menu.
        debugPauseAction->setEnabled(!compiling&&preferences.linkTarget==LT_TIEMU);
        debugResetAction->setEnabled(!compiling&&preferences.linkTarget==LT_TIEMU);
        bool runnable=!settings.archive&&!settings.flash_os&&preferences.linkTarget!=LT_NONE;
        menuBar()->setItemVisible(5,runnable); //debugMenu
        debugRunAction->setVisible(runnable);
        debugPauseAction->setVisible(runnable);
        break;        
      }
      case 15: projectCompile(); break;
      case 16: projectMake(); break;
      default: break;
    }
  } else {
    switch (index) {
      case 6:
      case 7:
      {
        QKeyEvent *keyEvent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Return,'\n',0,"\n");
        QApplication::postEvent(focusWidget(),keyEvent);
        break;
      }
      case 11: goto case_11;
      case 12: goto case_11;
      case 13: goto case_13;
      case 14: goto case_13;
      case 15: projectCompile(); break;
      case 16: projectMake(); break;
      default: break;
    }
  }

(Je saute d'un switch à un autre. tongue)

xctigcc, le plugin de news de tigcc_bot sur IRC:
          switch (ret) {
            case 1:
              data = xmliter_data(1);
              if (!data || strlen(data)>255) {
xml_parse_error:
                free(data);
                xmliter_done();
                goto parse_error;
              }
              strcpy(title,data);
              free(data);
              break;
            case 2:
              data = xmliter_data(1);
              if (is_atom) {
                if (!data || sscanf(data,"%4d-%2d-%2dT%2d:%2d:%2dZ",&y,&m,&d,&hr,&mn,&sc)<6)
                  goto xml_parse_error;
              } else {
                if (!data || sscanf(data,"%*3c, %d %3c %d %2d:%2d:%2d",&d,datebuffer,&y,&hr,&mn,&sc)<6)
                  goto xml_parse_error;
                if (!strncmp(datebuffer,"Jan",3)) m=1;
                else if (!strncmp(datebuffer,"Feb",3)) m=2;
                else if (!strncmp(datebuffer,"Mar",3)) m=3;
                else if (!strncmp(datebuffer,"Apr",3)) m=4;
                else if (!strncmp(datebuffer,"May",3)) m=5;
                else if (!strncmp(datebuffer,"Jun",3)) m=6;
                else if (!strncmp(datebuffer,"Jul",3)) m=7;
                else if (!strncmp(datebuffer,"Aug",3)) m=8;
                else if (!strncmp(datebuffer,"Sep",3)) m=9;
                else if (!strncmp(datebuffer,"Oct",3)) m=10;
                else if (!strncmp(datebuffer,"Nov",3)) m=11;
                else if (!strncmp(datebuffer,"Dec",3)) m=12;
                else goto xml_parse_error;
              }
              tm.tm_year = y-1900; tm.tm_mon = m-1; tm.tm_mday = d;
              tm.tm_hour = hr; tm.tm_min = mn; tm.tm_sec = sc;
              {
                const char *oldlocale = setlocale(LC_TIME,NULL);
                setlocale(LC_TIME,"C");
                strftime(datebuffer, 99, "%B %d, %Y %H:%M:%S", &tm);
                setlocale(LC_TIME,oldlocale);
              }
              free(data);
              break;
            case 3:
              data = xmliter_data(1);
              if (!data || strlen(data)>255) goto xml_parse_error;
              strcpy(author,data);
              free(data);
              break;
            case 4:
              xchat_commandf(ph, "notice %s %s  %s", nick, datebuffer, author);
              xchat_commandf(ph, "notice %s %s", nick, title);
              nc++;
              break;
          }

(Autre grand classique, le saut dans un if d'erreur.)

Et j'en ai plein d'autres.
avatarMes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

38

Kevin Kofler (./37) :
Quelques utilisations de goto dans mes logiciels:

Backgammon:
Ça c'est pas très lisible, et ça peut facilement s'écrire autrement. (tip: on a inventé les opérateurs de court-circuit)
L'algorithme ci-dessus est aussi la manière la plus efficace de tester si une année est bissextile ou non:
Je suis d'accord sur le principe, mais tu peux simplement écrire if ((x & 3) == 0 && (x % 100 != 0 || x % 400 == 0)) { /* Leap year */ } else { /* Not leap year */ }. Donc en fait non. (Même chose que l'exemple d'avant, en fait)
(Je saute d'un switch à un autre. tongue)
Ça c'est carrément dégueu.
(Autre grand classique, le saut dans un if d'erreur.)
On a inventé des langages avec gestion d'exception pour ça, mais admettons. Par contre le code est globalement illisible, donc bof tongue

Même si je défends le goto, je m'en sers vraiment pas souvent (le cas au dessus est un exemple où je m'en sers, mais je m'en cache pas), bien que plus souvent que d'autres développeurs. Toi, tu sembles t'en servir beaucoup trop souvent ^^
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

39

GoldenCrystal (./38) :
(Je saute d'un switch à un autre. tongue)
Ça c'est carrément dégueu.

Bah, ça évite soit 2 énormes copiers-collers de blocs entiers, soit si je distribue le if à l'intérieur du switch, un copier-coller du if 9 fois.
(Autre grand classique, le saut dans un if d'erreur.)
On a inventé des langages avec gestion d'exception pour ça, mais admettons. Par contre le code est globalement illisible, donc bof tongue

Bah, c'est plus facile à comprendre si tu as le contexte, j'aurais dû en mettre un peu plus:
        const char * const rss_items[4]={"rss/channel/item/title","rss/channel/item/pubDate","rss/channel/item/dc:creator","/rss/channel/item"};
        const char * const atom_items[4]={"feed/entry/title","feed/entry/issued","feed/entry/author/name","/feed/entry"};
        xmliter_setup(filebuffer,4,is_atom?atom_items:rss_items);
        while ((ret=xmliter_next()) > 0 && nc < MAXNEWS) {
          char *data;
          switch (ret) {

et l'API de xmliter:
// start iterating over buf, looking for the items with the paths given in items
// a path not starting with / is an enter event, a /path is a leave event
void xmliter_setup(const char *buf, unsigned n_items,
                   const char * const *items);

// iterate to the next tag matching one of the desired paths
// returns: >0 (the 1-based index of the item in items) if found
//          0  if the end of buf (terminating \0) was reached with no error
//          <0 (an error code) if an error occurred
int xmliter_next(void);

// returns the data contained in the tag (including subtags), unescaping any
// CDATA or entities discovered, in a buffer allocated with malloc
// unescape_all=1: all characters including &, < and > are unescaped
// unescape_all=0: &, < and > remain escaped to distinguish from nested tags
char *xmliter_data(int unescape_all);

// frees the internal buffers for XML iteration
void xmliter_done(void);
avatarMes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

40

squalyl (./28) :
GT: Rassure toi, l' "asm virtuel" genere par le code java utilise bien des jumps, lui grin


Je m'en doute wink

On peux rendre un code beaucoup plus illisible en retirant les branchements, exemple :
move.w Feuille_gauche(a0),d5 btsts d3,(a6) beq.s Cest_la_bonne_feuille move.w Feuille_droite(a0),d5 Cest la bonne feuille: que j'ai remplacé par cela : btst d3,(a6) sne d0 and.w d7,d0 ! d7=2 move.w 0(a0,d0.w),d5

Donc le coup de la lisibilité c'est surfait tongue vous allez me dire mais c'est pas un langage (l'asm) de haut niveau, peut être pour vous, pour moi ca l'est. Un langage qui me laisse faire tout ce que je veux, c'est du haut niveau, c'est la liberté !!! top

En langage évolué il y a des moyens de contourner, mais cela fais vite grossir la taille finale du fichier, vous allez me dire oui mais la ram est pas chere, bon a cette heure pas beaucoup de téléphones on 4 gigas. Je suis sur que l'implémentation du goto permetrait de diminuer la taille des codes.

Zéro : c'est pour éviter qu'on me pique mes super codes... lol


GT Illisible par défaut grin
avatar< SCPCD > j'aurais du dire "les doigts dans le cul vu que le java c'est de la merde"
Je suis Goto !

41

GT Turbo (./40) :
btsts d3,(a6)

GT, l'homme qui testait plusieurs fois ses bits, pour être vraiment sûr de leur position grin

Autre proposition:
        move.l  Feuille_gauche(a0),d5
        btst.l  d3,(a6)
        bne.s   Cest_la_bonne_feuille
        swap.w  d5

Cest_la_bonne_feuille:

C'est plus court, car j'ai pas à initialiser d7 cheeky
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

42

Kevin Kofler (./39) :
GoldenCrystal (./38) :
(Je saute d'un switch à un autre. tongue)
Ça c'est carrément dégueu.

Bah, ça évite soit 2 énormes copiers-collers de blocs entiers, soit si je distribue le if à l'intérieur du switch, un copier-coller du if 9 fois.
C'est pas l'impression que j'en ai… Change l'architecture de ton code et il y aura moins de code:BOOL newFlagThatICreated; if ((newFlagThatICreated = CURRENT_VIEW && CURRENT_VIEW->hasFocus()) || index >= 6) { switch (index) { case 0: editUndo(); break; case 1: editRedo(); break; case 2: editCut(); break; case 3: editCopy(); break; case 4: editPaste(); break; case 5: // F1 context help { int line,col,i; CURRENT_VIEW->cursorPosition().position(line,col); QString textLine=CURRENT_VIEW->document()->line(line); QString wordUnderCursor; for (i=col-1;i>=0;i--) { QChar c=textLine[i]; if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9') || c=='_' || c=='$' || c=='#') wordUnderCursor.prepend(c); } int len=textLine.length(); for (i=col;i<len;i++) { QChar c=textLine[i]; if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9') || c=='_' || c=='$' || c=='#') wordUnderCursor.append(c); } // always open at least the index force_qt_assistant_page(1); assistant->openAssistant(); if (wordUnderCursor.isEmpty()) return; QString docFile=lookup_doc_keyword(wordUnderCursor); if (docFile.isEmpty()) return; // wait for Qt Assistant to actually open while (!assistant->isOpen()) QCoreApplication::processEvents(QEventLoop::ExcludeUserInput,1000); assistant->showPage(QString(tigcc_base)+QString("/doc/html/")+docFile); break; } case 6: case 7: if (newFlagThatICreated) { // keyReturn is not in any interface, but it's a public slot... CURRENT_VIEW->qt_metacall(QMetaObject::InvokeMetaMethod, CURRENT_VIEW->metaObject()->indexOfMethod("keyReturn()"),NULL); current_view_newLineHook(); } else { QKeyEvent *keyEvent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Return,'\n',0,"\n"); QApplication::postEvent(focusWidget(),keyEvent); } break; case 8: if (newFlagThatICreated) { new TemplatePopup(CURRENT_VIEW); } break; case 9: case 10: if (newFlagThatICreated && IS_FILE(currentListItem) && CURRENT_VIEW==static_cast<ListViewFile *>(currentListItem)->kateView) { QString fileText=CURRENT_VIEW->document()->text(); CATEGORY_OF(category,currentListItem); // Completion only operates on C files. if (category==cFilesListItem || category==qllFilesListItem || (category==hFilesListItem && !fileText.isEmpty() && fileText[0]!='|' && fileText[0]!=';')) { // Disable newLineHook. shortcuts[6]->setEnabled(FALSE); shortcuts[7]->setEnabled(FALSE); new CompletionPopup(CURRENT_VIEW,pathInProject(currentListItem),this,this); } } break; case 11: // next file case 12: { Q3ListViewItem *item=currentListItem; if (!item) item=rootListItem; Q3ListViewItem *origItem=item; do { item=item->itemBelow(); if (!item) item=rootListItem; if (item==origItem) return; // no suitable items to select } while (item==rootListItem || IS_CATEGORY(item)); fileTreeClicked(item); if (CURRENT_VIEW) CURRENT_VIEW->setFocus(); break; } case 13: // switch transfer target case 14: { preferences.linkTarget=(preferences.linkTarget==LT_TIEMU)?LT_REALCALC:LT_TIEMU; savePreferences(); // Apply the preferences to the debug menu. debugPauseAction->setEnabled(!compiling&&preferences.linkTarget==LT_TIEMU); debugResetAction->setEnabled(!compiling&&preferences.linkTarget==LT_TIEMU); bool runnable=!settings.archive&&!settings.flash_os&&preferences.linkTarget!=LT_NONE; menuBar()->setItemVisible(5,runnable); //debugMenu debugRunAction->setVisible(runnable); debugPauseAction->setVisible(runnable); break; } case 15: projectCompile(); break; case 16: projectMake(); break; default: break; } }À moins que j'aie zappé un truc, ça doit fonctionner…
(C'est juste un refactoring léger parce que j'ai pas que ça à foutre, mais y'a moyen de faire carrément mieux… Par exemple une fonction pour chaque cas réellement différent, ça peut être pas mal tongue)
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

43

Folco (./41) :
GT Turbo (./40) :
btsts d3,(a6)

GT, l'homme qui testait plusieurs fois ses bits, pour être vraiment sûr de leur position grin

Autre proposition:
        move.l  Feuille_gauche(a0),d5
        btst.l  d3,(a6)
        bne.s   Cest_la_bonne_feuille
        swap.w  d5

Cest_la_bonne_feuille:

C'est plus court, car j'ai pas à initialiser d7 cheeky


D7 coute pas grand chose par rapport au gain, car mes quelques lignes sont dans une boucle (Ce morceau de code parcours un arbre binaire). Donc après deux boucles, mon moveq #2,d7 (qui est en dehors de la boucle) est rentabilisé.

btst.l marche pas terrible, car en cas de lecture mémoire, seul les 8 bits sont lisibles. donc SCPCD si tu pouvais rajouter un btsts.l (Dans ton 68000) Folco et moi même on te serait reconnaissant wink

Par contre ta version est super intérressante Folco. J'attends juste de voir le retour de ma version, car c'est pour tourner sur un 030 (L'auteur du jeu m'a demandé si j'arrivais pas a retirer certains branchements, d'ou ce 'funky' code ).

GoTo smile
avatar< SCPCD > j'aurais du dire "les doigts dans le cul vu que le java c'est de la merde"
Je suis Goto !

44

GoldenCrystal (./42) :
À moins que j'aie zappé un truc, ça doit fonctionner…

Ton code est erroné, les cas 0 à 6 ne sont qu'à traîter si le flag est vrai eux aussi.
EDIT: En fait non. smile
avatarMes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

45

C'est pris en compte
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

46

Oui, mais franchement, si c'est vraiment plus lisible que mon code, ça se discute… if avec =, un test index >= 6 en plus du switch, if (newFlagThatICreated) répété 3 fois.
avatarMes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

47

Ouais mais au moins y'a pas un saut entre deux blocs de code complètement disjoints… Ce qui est vraiment dégueu.
Après, si tu veux, je peux pousser le refactoring plus loin mais tu ne reconnaîtras plus ton code… (Et en fait non, j'ai franchement autre chose à foutre grin)
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

48

Pour le rendre plus lisible, mettez des commentaires dans votre code wink
avatarWebmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

49

Oui des labels (Pour le Goto !)


Goto Label !
avatar< SCPCD > j'aurais du dire "les doigts dans le cul vu que le java c'est de la merde"
Je suis Goto !

50

51

Changes ton pseudo ! GoTo Turbo !
avatarWebmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

52

goto reador
goto hell
goto toro

53

squalyl (./50) :
labellisons le goto! Goto AOC!


Yes !!! Car sinon il va bientot disparaitre !!



GT Pour sauvé le GoTo tongue !!
avatar< SCPCD > j'aurais du dire "les doigts dans le cul vu que le java c'est de la merde"
Je suis Goto !

54

GoldenCrystal (./47) :
Ouais mais au moins y'a pas un saut entre deux blocs de code complètement disjoints… Ce qui est vraiment dégueu.

C'est pourtant tout l'intérêt de la commande.
avatarMes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

55

int ret = -ERR_XML_PARSE; const char *oldlocale = setlocale(LC_TIME,NULL); [...] switch (ret) { case 1: data = xmliter_data(1); if (!data || (strlen(data) > 255)) { ret = -ERR_PARSE; goto parse_error; } strcpy(title,data); free(data); break; case 2: data = xmliter_data(1); if (is_atom) { if (!data || (sscanf(data,"%4d-%2d-%2dT%2d:%2d:%2dZ",&y,&m,&d,&hr,&mn,&sc) < 6)) { goto xml_parse_error; } } else { if (!data || (sscanf(data,"%*3c, %d %3c %d %2d:%2d:%2d",&d,datebuffer,&y,&hr,&mn,&sc) < 6)) { goto xml_parse_error; } if (!strncmp(datebuffer,"Jan",3)) { m=1; } else if (!strncmp(datebuffer,"Feb",3)) { m=2; } else if (!strncmp(datebuffer,"Mar",3)) { m=3; } else if (!strncmp(datebuffer,"Apr",3)) { m=4; } else if (!strncmp(datebuffer,"May",3)) { m=5; } else if (!strncmp(datebuffer,"Jun",3)) { m=6; } else if (!strncmp(datebuffer,"Jul",3)) { m=7; } else if (!strncmp(datebuffer,"Aug",3)) { m=8; } else if (!strncmp(datebuffer,"Sep",3)) { m=9; } else if (!strncmp(datebuffer,"Oct",3)) { m=10; } else if (!strncmp(datebuffer,"Nov",3)) { m=11; } else if (!strncmp(datebuffer,"Dec",3)) { m=12; } else { goto xml_parse_error; } } tm.tm_year = y-1900; tm.tm_mon = m-1; tm.tm_mday = d; tm.tm_hour = hr; tm.tm_min = mn; tm.tm_sec = sc; setlocale(LC_TIME,"C"); strftime(datebuffer, 99, "%B %d, %Y %H:%M:%S", &tm); setlocale(LC_TIME,oldlocale); free(data); break; case 3: data = xmliter_data(1); if (!data || strlen(data)>255) { goto xml_parse_error; } strcpy(author,data); free(data); break; case 4: xchat_commandf(ph, "notice %s %s %s", nick, datebuffer, author); xchat_commandf(ph, "notice %s %s", nick, title); nc++; break; } [...] ret = 0; goto exit; xml_parse_error: free(data); xmliter_done(); parse_error: [...] exit: return ret; }

Tellement plus propre...
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

56

Ah tiens, t'as réussi à rendre le code agréable à lire… Marrant smile
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

57

Et encore, il reste des points améliorables. Par exemple, tous ces strncmp() copié-collés peuvent être remplacés par un tableau contenant les noms des mois, et une simple boucle.
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

58

Oui bien sur, je n'ai pas volontaireent touche au code, juste reindente, utilise la balise code et virer cet ignoble goto pour le remplacer par un plus joli.
Le code est identique avec juste quelques lignes en plus et d'autre simplemetn deplace
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

59

Oui bien sur, je n'ai pas volontaireent touche au code, juste reindente, utilise la balise code et virer cet ignoble goto pour le remplacer par un plus joli.
Le code est identique avec juste quelques lignes en plus et d'autre simplemetn deplace


Allez un peu plus de indentfun grin
int returnMoves = numlegalfullmoves; if (!numlegalfullmoves) { if ( (!numlegaldie1moves) || (abs(die2) > abs(die1)) ) { for (unsigned short i=0;i<numlegaldie2moves;i++) { legalmoves[i][1]=legaldie2moves[i]; legalmoves[i][3]=legalmoves[i][2]=legalmoves[i][0]=-128; } returnMoves = numlegaldie2moves; } if (!numlegaldie2moves) { for (unsigned short i=0;i<numlegaldie1moves;i++) { legalmoves[i][0]=legaldie1moves[i]; legalmoves[i][3]=legalmoves[i][2]=legalmoves[i][1]=-128; } returnMoves = numlegaldie1moves; } } return returnMoves; }

Tellement plus propre...
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

60

pencil
(Bon après moi j'aurais mis des espaces après les points virgules et autour des signes = dans les for, mais bon c'est pour faire chier tongue)
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes