На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (77) « Первая ... 4 5 [6] 7 8 ...  76 77  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    imo не хватает только break n; ! (в смысле брейк через несколько циклов)
    даже в интерпретаторе php есть...
    это единственное место, где приходится использовать метки
      Цитата bor.is @
      это единственное место, где приходится использовать метки

      А разве приходится? Неужели без них не обойтись? ;)
      Я конечно слышал о том, что некто, разработчик драйвера TCP/IP стека для BSD сказал, мол, что если вам и удасться реализовать его без goto, то код будет ещё более запутанным и непонятным, но, всё равно, для меня воспользоваться goto - всё равно, что религию предать :).
        Тут где-то дальше по тексту была любопытная дискуссия.
          IMHO, тут дискутировать нечего, ибо
          1. Использование goto вырабатывает не очень хорошую(читай очень плохую) привычку "мыслить goto'ми", что сказывается на алгоритмах, в которых без goto можно обойтись без любых костылей.
          2. Пока пишешь код для себя - на здоровье(но учесть п.1), но когда другой человек начнёт читать твой код с goto, то, хорошо, если его не стошнит.
          3. Всегда есть лаконичный способ избежать goto.
          Сообщение отредактировано: archimed7592 -
            Цитата Qraizer @
            Тут где-то дальше по тексту была любопытная дискуссия.

            Ну, какая же это дискуссия. :) Вот у нас была дискуссия - исключения + стиль
            :lol:
              archimed7592 Ты по ссылке-то ходил? Первый тезис вообще не аргумент, скорее ИМХО. Остальные два в ссылке опровергаются.
              Hryak Просто Boroda всех быстро уболтал, а вы так быстро не смогли :P
                Цитата Qraizer @
                Первый тезис вообще не аргумент, скорее ИМХО.

                Ну, если сходить по ссылке Hryak'а, то можно увидеть, что это IMHO не только моё, но и Дейкстры :lol:.

                Цитата Qraizer @
                Остальные два в ссылке опровергаются.

                Как можно опровергнуть второй тезис я не очень то себе представляю(что, проводили следственный эксперимент: кого стошнит, а кого - нет :lol:?), а опровержения третьему тезису я, увы, не нашёл :whistle:.
                  Цитата archimed7592 @
                  Как можно опровергнуть второй тезис я не очень то себе представляю(что, проводили следственный эксперимент: кого стошнит, а кого - нет ?), а опровержения третьему тезису я, увы, не нашёл .
                  Ко второму тезису я просто подошёл творчески и стал понимать его буквально. Насчёт опровержения - так Boroda-е так никто и предложил безгоутный вариант его примера. Сам сможешь написать и сравнить с гоутным решением? Я, кстати, могу эту задачу ещё усложнить.
                    Цитата Qraizer @
                    Насчёт опровержения - так Boroda-е так никто и предложил безгоутный вариант его примера.

                    Объявляешь счетчики цикла с инициализацией нулем, убираешь во всех for содержимое до первой ; и убираешь goto с меткой. Всё.
                    Сообщение отредактировано: Hryak -
                      Цитата Qraizer @
                      Насчёт опровержения - так Boroda-е так никто и предложил безгоутный вариант его примера. Сам сможешь написать и сравнить с гоутным решением? Я, кстати, могу эту задачу ещё усложнить.

                      Тут скорее возникает вопрос, каким образом вообще возник подобный код.
                      Не существует ли более красивого алгоритма для решения задачи? В той теме это упоминается.
                        Цитата gryz @
                        Тут скорее возникает вопрос, каким образом вообще возник подобный код.

                        Вот о том и речь - использование goto даже очень редко, в последствии порождает подобный код(см. 1-й тезис, который "скорее ИМХО").
                          Цитата Hryak @
                          Объявляешь счетчики цикла с инициализацией нулем, убираешь во всех for содержимое до первой ; и убираешь goto с меткой. Всё.
                          Точно всё? Ничего не забыл? Попробуй. Хотя бы на двух вложенных циклах.
                          Чтобы не флеймить, вот сразу более сложный пример, который я имел в виду:
                          ExpandedWrap disabled
                            #include <io.h>
                            #include <conio.h>
                            #include <fstream>
                            #include <iostream>
                             
                            int main()
                            {
                             int i, j, k;
                             
                             if(_access("savedstate.dat", 4)==0)
                             {
                              std::ifstream inFile("savedstate.dat");
                              bool ok = true;
                             
                              ok = ok && inFile.read(reinterpret_cast<char*>(&i), sizeof(i)).gcount()==sizeof(i);
                              ok = ok && inFile.read(reinterpret_cast<char*>(&j), sizeof(j)).gcount()==sizeof(j);
                              ok = ok && inFile.read(reinterpret_cast<char*>(&k), sizeof(k)).gcount()==sizeof(k);
                              if(ok && (inFile.good() || inFile.eof()))
                              {
                               std::cout << "The saved state is restored successful." << std::endl;
                               goto resume;
                              }
                              return std::cerr << "The saved state restoring error. State file is wrong." << std::endl,
                                     1;
                             }
                             
                             for(i=0; i<10; ++i)
                              for(j=i; j<10; ++j)
                               for(k=j; k<10; ++k)
                               {
                            resume:
                                /* ... */
                                if(kbhit() && getch() == '\x1B')
                                {
                                 if(_access("savedstate.dat", 2)==0)
                                 remove("savedstate.dat");
                             
                                 std::ofstream outFile("savedstate.dat");
                                 bool ok = true;
                             
                                 ok = ok && outFile.write(reinterpret_cast<char*>(&i), sizeof(i)).good();
                                 ok = ok && outFile.write(reinterpret_cast<char*>(&j), sizeof(j)).good();
                                 ok = ok && outFile.write(reinterpret_cast<char*>(&k), sizeof(k)).good();
                                 if(!(ok && (outFile.good() || outFile.eof())))
                                  return std::cerr << "The state saving error." << std::endl,
                                         1;
                                 return std::cout << "The state saved successful." << std::endl,
                                        2;
                                }
                               }
                             if(_access("savedstate.dat", 2)==0)
                              remove("savedstate.dat");
                             ret
                            }
                          Нет смысла указывать так много вложенностей, поэтому я их уменьшил с двенадцати до трёх. В принципе, я могу предложить метапрограммное решение, разумеется безгоутное, которое к тому же параметризирует количество вложенных циклов, но оно конечно же будет на порядок сложнее, чем структурное безгоутное.
                          Цитата gryz @
                          Тут скорее возникает вопрос, каким образом вообще возник подобный код.
                          Не существует ли более красивого алгоритма для решения задачи?
                          Ну как же? Там же ясно сказано - это было написано для возможности очень долгий алгоритм прервать с сохранением состояния и с возможностью продолжить с запомненного состояния. Ну и что, что это было под DOSом, которая была однозадачной? Счас-то ведь тоже вполне может возникнуть потребность перегрузить ОСь зачем-нибудь...

                          P.S. У этого форума есть возможность большие куски кода делать скроллируемыми, чтоб не занимали много места?
                          Сообщение отредактировано: Qraizer -
                            Цитата Qraizer @
                            Точно всё? Ничего не забыл? Попробуй. Хотя бы на двух вложенных циклах.

                            Да, забыл.

                            Цитата
                            Чтобы не флеймить, вот сразу более сложный пример, который я имел в виду

                            ExpandedWrap disabled
                              #include <io.h>
                              #include <conio.h>
                              #include <fstream>
                              #include <iostream>
                               
                              int main()
                              {
                                  bool resuming = _access("savedstate.dat", 4)==0;
                                  for(int i=0; i<10; ++i)
                                      for(int j=i; j<10; ++j)
                                          for(int k=j; k<10; ++k)
                                          {
                                              if (resuming)
                                              {
                                                  resuming = false;
                                                  std::ifstream inFile("savedstate.dat");
                                                  bool ok = true;
                               
                                                  ok = ok && inFile.read(reinterpret_cast<char*>(&i), sizeof(i)).gcount()==sizeof(i);
                                                  ok = ok && inFile.read(reinterpret_cast<char*>(&j), sizeof(j)).gcount()==sizeof(j);
                                                  ok = ok && inFile.read(reinterpret_cast<char*>(&k), sizeof(k)).gcount()==sizeof(k);
                                                  if(ok && (inFile.good() || inFile.eof()))
                                                      std::cout << "The saved state is restored successful." << std::endl;
                                                  return std::cerr << "The saved state restoring error. State file is wrong." << std::endl,
                                                      1;
                                              }
                               
                                              /* ... */
                               
                                              if(kbhit() && getch() == '\x1B')
                                              {
                                                  if(_access("savedstate.dat", 2)==0)
                                                      remove("savedstate.dat");
                               
                                                  std::ofstream outFile("savedstate.dat");
                                                  bool ok = true;
                               
                                                  ok = ok && outFile.write(reinterpret_cast<char*>(&i), sizeof(i)).good();
                                                  ok = ok && outFile.write(reinterpret_cast<char*>(&j), sizeof(j)).good();
                                                  ok = ok && outFile.write(reinterpret_cast<char*>(&k), sizeof(k)).good();
                                                  if(!(ok && (outFile.good() || outFile.eof())))
                                                      return std::cerr << "The state saving error." << std::endl,
                                                      1;
                                                  return std::cout << "The state saved successful." << std::endl,
                                                      2;
                                              }
                                          }
                                  if(_access("savedstate.dat", 2)==0)
                                      remove("savedstate.dat");
                                  ret
                              }

                            Вот только не надо со мной спорить, что твой вариант проще, лучше и т.п. Не теряй времени, спорить я с тобой не буду (свое отношение к goto я высказал в указанной мной ранее теме и отношение это с той поры не изменилось). Ты просил безгоутное решение - я его привел. Для людей, принципиально не использующих goto - очень даже сойдёт.

                            Суть в чем - использование goto может сделать структурированную программу неструктурированной. Это goto в вину и вменяют. Однако, приведенная тобой задача изначально имеет антиструктурированный элемент прямо в своей постановке. Логично, что неструктурированность из постановки задачи перетекает в решение и вполне естественно применение тут goto. Но можно его и не применять...
                              Зачем же спорить? Количество потраченного времени на битие по клавишам и отладку в совокупности само рассудит. Текст вполне себе читабелен, хоть и чуточку менее интуитивен. Так что в целом авекватные результаты. Впрочем, переприсваивание параметров циклов в теле этих же циклов тоже как-то не совсем структурно, но это уже если придираться.
                              Только не надо мне приписывать защиту goto. Спорить я начал с аргументами archimed7592-а, а отнюдь не с мнением достаточно авторитетных теоретиков. В лице Дейкстры, в частности. И ссылку привёл просто в подтверждение тезиса не упомянутого по имени "разработчика драйвера TCP/IP стека для BSD".
                                Цитата Qraizer @
                                Спорить я начал с аргументами archimed7592-а

                                Ок, все остались при своём мнение, вопрос исчерпан :lol:.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (77) « Первая ... 4 5 [6] 7 8 ...  76 77


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0450 ]   [ 17 queries used ]   [ Generated: 24.04.24, 15:10 GMT ]