На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ANDLL, ALXR
Страницы: (12) « Первая ... 5 6 [7] 8 9 ...  11 12 все  ( Перейти к последнему сообщению )  
> #define ИЛИ template? , C++
   
#define ИЛИ template
Гости не могут просматривать результаты голосования.
Гости не могут голосовать 
    А почему просто не завести классик для "позиции" с каким-то next и is_done(или вообще полноценные итераторы/диапазоны)? Мне кажется, что в реальном проде что-то такое и было бы...
      На предмет goto в библиотеках MS.
      Исключения полноценно стали поддерживаться только в VC4.2, который увидел свет в 1998-ом, незадолго до VC6. До этого компилятор их понимал очень ограничено, а до версии 4.0 (вроде бы) не понимал вообще. Библиотека MFC увидела свет в ...1992-ом, ещё на 16-битном Microsoft Quick C for Windows. Соответственно потому в MFC есть собственные exception-макросы. ATL разрабатывалась попозже, но не сильно. Первые версии вошли в, если не ошибаюсь, тот же VC4.2. Соответственно использование там C++EH было, наверное возможным, но были, видать, причины не раскачивать лодку. Тем более, что совмещение SEH с C++EH в пределах одной программы всё-таки и сегодня иногда вызывает определённые сложности.
        Цитата D_KEY @
        А почему просто не завести классик для "позиции" с каким-то next и is_done(или вообще полноценные итераторы/диапазоны)? Мне кажется, что в реальном проде что-то такое и было бы...

        Потому что тут идет переписывание уже существующего, готового кода, а не написание с нуля :rolleyes:

        Добавлено
        Я родил еще одно решение, возможно правильное, по крайней мере для разных сохраненных состояний выдает вроде верный резхультат:
        ExpandedWrap disabled
          #include <windows.h>
          #include <io.h>
          #include <conio.h>
          #include <fstream>
          #include <iostream>
           
          int SaveStateToFile(int i, int j, int k, int l)
          {
              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();
              ok = ok && outFile.write(reinterpret_cast<char*>(&l), sizeof(l)).good();
              if (!(ok && (outFile.good() || outFile.eof())))
                  return std::cerr << "The state saving error." << std::endl, 1;
              return std::cout << "The state successfully saved." << std::endl, 2;
          }
           
          int main()
          {
              int itI, itJ, itK, itL;
              int savedI, savedJ, savedK, savedL;
              std::ofstream log;
              log.open("file.log", std::ofstream::out | std::ofstream::trunc);
              std::clog.rdbuf(log.rdbuf());
           
              bool          mega_ok = false;
              if (_access("savedstate.dat", 4) == 0)     // Проверить, нет ли сохранённого состояния от предыдущего запуска
              {                                             // Если есть, восстановить и продолжиться
                  std::ifstream inFile("savedstate.dat");
                  mega_ok = inFile.read(reinterpret_cast<char*>(&savedI), sizeof(savedI)).gcount() == sizeof(savedI);
                  mega_ok &= inFile.read(reinterpret_cast<char*>(&savedJ), sizeof(savedJ)).gcount() == sizeof(savedJ);
                  mega_ok &= inFile.read(reinterpret_cast<char*>(&savedK), sizeof(savedK)).gcount() == sizeof(savedK);
                  mega_ok &= inFile.read(reinterpret_cast<char*>(&savedL), sizeof(savedL)).gcount() == sizeof(savedL);
                  if (mega_ok && (inFile.good() || inFile.eof()))
                  {
                      std::cout << "The saved state is successfully restored." << std::endl;
                      //goto resume;
                  }
                  else return std::cerr << "The saved state restoring error. State file is wrong." << std::endl,
                      1;
              }
           
              for (itI = 0; itI<10; ++itI)
              {
                  for (itJ = itI; itJ<10; ++itJ)
                  {
                      for (itK = itJ; itK<10; ++itK)
                      {
                          for (itL = itK; itL<10; ++itL)
                          {
                              if (mega_ok) //! Если файл был прочитан, востанавливаем значения из файла 1 раз.
                              {
                                  itI = savedI;
                                  itJ = savedJ;
                                  itK = savedK;
                                  itL = savedL;
                                  mega_ok = false;
                              }
           
                              if (kbhit() && getch() == '\x1B')     // Проверить, не просят ли нас ESCпом прерваться
                              {                                     // Если да, сохранить состояние и выйти
                                  //if (_access("savedstate.dat", 2) == 0) remove("savedstate.dat"); //! <<<<<< Закоментируй чтобы начать с определенного состояния
           
                                  return SaveStateToFile(itI, itJ, itK, itL);
                              }
                                                                    
                              std::clog << "i = " << itI << ", j = " << itJ << ", k = " << itK << ", l = " << itL<< std::endl;
                              Sleep(1);
                          }
                      }
                  }
              }
           
              std::cout << "Done... Pres any key...";
              std::cin.get();
          //  if (_access("savedstate.dat", 2) == 0) remove("savedstate.dat"); //! <<<<<< Закоментируй чтобы начать с определенного состояния
           
           
              std::clog.flush();
              return 0;
          }


        Добавлено
        Что скажете? Вроде как похоже на рабочее. Т.е. после того как мы читаем файл - мы не прыгаем внутрь циклов. Мы после вхождения в самый вложенный цикл просто проверяем - если данные из файла прочитаны, то мы ими инициализируем итераторы, и ставим флаг в состояние ложь(файл не прочитан), и все начинается крутится с этих значений. Если файл не прочитан - пройдет инициализация в циклах.

        Добавлено
        Для удобства чтения убрал сохранение состояния в отдельную функцию, оно только реально запутывает.
        Сообщение отредактировано: KILLER -
          Ну вот все спать ушились, а у меня голова забита этим гребаным алгоритмом, и мыслей куча. Что теперь деать?
            Цитата KILLER @
            Цитата D_KEY @
            А почему просто не завести классик для "позиции" с каким-то next и is_done(или вообще полноценные итераторы/диапазоны)? Мне кажется, что в реальном проде что-то такое и было бы...

            Потому что тут идет переписывание уже существующего, готового кода, а не написание с нуля :rolleyes:

            Это больше к Qraizer'у вопрос.
              Цитата D_KEY @
              А почему просто не завести классик для "позиции" с каким-то next и is_done(или вообще полноценные итераторы/диапазоны)? Мне кажется, что в реальном проде что-то такое и было бы...

              Я так и сделал в своей этой задаче. next получился примерно таким:
              ExpandedWrap disabled
                bool next()
                {
                    int *a[n] = {&i, &j, &k, &l};
                    int c = n - 1;
                    while(c >= 0 && *a[c] == 10) --c;
                    if(c < 0) return false;
                    while(c < n)
                    {
                        ++c;
                        *a[c] = *a[c - 1];
                    }
                    return true;
                }

              Куда менее читаемо - порядок обхода сразу и не ясен.

              Цитата KILLER @
              Что скажете?

              Весьма неплохо, кстати. Я бы даже сказал, что вполне приемлемо - проследить логику тут сложнее, чем с goto, но проще, чем в вариантах, предлагаемых в той теме. Плюс по-моему вполне заслужил :yes:
                Цитата KILLER @
                Что теперь деать?

                Ну и заводной ты чел, Киля :lol:
                У меня тож нечто похожее получилось без прыжков. Но оверхед на проверках явный.

                ExpandedWrap disabled
                  #include <iostream>
                  #include <fstream>
                   
                  using namespace std;
                   
                  void FuncSave(const int a, const int b, const int c) {
                    ofstream f("saved.txt");
                    f << a << "\n" << b << "\n" << c;
                  }
                   
                  bool FuncRestore(int& a, int& b, int& c) {
                    a = 0; b = 0; c = 0;
                    ifstream f("saved.txt");
                    if (!f.good()) return false;
                    cout << "Восстанавливаемся и продолжаем ..." << endl;
                    f >> a >> b >> c;
                    return true;
                  }
                   
                  int main() {
                    int i,j,k;
                    bool r = FuncRestore(i,j,k);
                    for(i = (r) ? i:0; i<5; i++) {
                      for(j = (r) ? j:i; j<5; j++) {
                        for(k = (r) ? k:j; k<5; k++) {
                          if (r) { r = false; continue; }
                          // делаем важное дело
                          cout << i << ":" << j << ":" << k << endl;
                          // эмуляция прерывания
                          if (i==2 && j==2 && k==2) {
                            cout << "Прервемся на 2:2:2 и сохраняемся" << endl;
                            FuncSave(i,j,k);
                            return 0;
                          }
                        }
                      }
                    }
                    return 0;
                  }


                Вывод после двух запусков вот такой:
                Скрытый текст
                ExpandedWrap disabled
                  0:0:0
                  0:0:1
                  0:0:2
                  0:0:3
                  0:0:4
                  0:1:1
                  0:1:2
                  0:1:3
                  0:1:4
                  0:2:2
                  0:2:3
                  0:2:4
                  0:3:3
                  0:3:4
                  0:4:4
                  1:1:1
                  1:1:2
                  1:1:3
                  1:1:4
                  1:2:2
                  1:2:3
                  1:2:4
                  1:3:3
                  1:3:4
                  1:4:4
                  2:2:2
                  Прервемся на 2:2:2 и сохраняемся
                  Для закрытия данного окна нажмите <ВВОД>...
                   
                  Восстанавливаемся и продолжаем ...
                  2:2:3
                  2:2:4
                  2:3:3
                  2:3:4
                  2:4:4
                  3:3:3
                  3:3:4
                  3:4:4
                  4:4:4
                  Для закрытия данного окна нажмите <ВВОД>...
                  Цитата KILLER @
                  Что скажете?

                  Думаю, что для прода этот вариант лучше, чем с goto :)
                  Но на работе я бы вообще сделал шаг назад и посмотрел на другие варианты решения вцелом.

                  Добавлено
                  Цитата OpenGL @
                  Куда менее читаемо - порядок обхода сразу и не ясен.

                  Зато с использованием уже проблем не будет, там будет ясно, что и зачем делается. А над этим куском, отвечающим за переход к следующему, можно дальше подумать. В итоге лапши меньше.
                    Цитата OpenGL @
                    Твой пример - втупую переписанный код без осознания того, что это схема и, соответсвенно, того, в чём там реальная сложность, только и всего. И поскольку это уже было разжёвано не один раз, то я повторять смысла, что конкретно у тебя не так, не вижу - ты всё равно не поймёшь :D

                    Слушай, а хорошую ты позицию занял, выдумал какую то хрень, и топишь за нее. cppasm почему то не догадался придраться к тому, к чему придрался ты. Он наверное просто хуже тебя знает что он сам и писал? Или ты за него додумал и привел аргумент? Чтоб та программа работала как говоришь ты, необходимо было вставить после цикла хотя бы три точки. Чтобы было ясно - что между циклом и выходом есть еще код. В противном случае ты не имеешь никакого морального права упрекать меня в том, что мой пример не соответствует его примеру. Приводи свой пример, как ты расписываешь, я перепишу его, если будет время. А то сначало привели какую то шнягу, вам ее переписали, а потом вы меняете условие задачи, чтоб обвинить меня в том, что мой пример не работает? Не по людски получается как то. Я не телепат что бы догадываться что он там хотел написать. И где гарантии что ты еще щас что то не придумаешь, может у него там еще одна метка есть, за циклом, которая перемещает нас обратно внутрь цикла, ну это же очевидно, просто ты ее не видешь, так как не понимаешь логику программы. Да?

                    Цитата OpenGL @
                    Я - не неосилятор, как некоторые, и сразу понял, что делает обсуждаемая функция, равно как и понял логику её работы. Знал бы спецификацию http или семантику полей, в которые она пишет - понял бы полностью, вплоть до возможности не напрягаясь внести в неё изменения. ЧЯДНТ? :D

                    А я неосилятор, даже смотреть ее не стал. Я просто кинул взгляд и сразу понял - это трешь. Хорошо написанный код - я бы понял сразу, просто кинув взгляд(за исключением алгоритмов и разных вычислений). Тут нужно метку искать по коду глазами, и пока ты не найдешь все метки глазами - ты не поймешь что там происодит. А это уже -10 к читабельности кода. Если меток больше 1 и раскиданы по функции это уже -50 к читабельности кода. В итоге функция может быть и простой, но только не удобочитаемой.

                    Цитата OpenGL @
                    Капитан, перелогинься :lool: Кто тут с этим спорит вообще? Ну да, может и не найти, и в этом случае лучше написать без goto. Но ведь может и найти - что тогда?

                    Ну ты же сравнивал предположение с моим утверждением :-? Я не отрицал что может и найти. Я утверждал что goto - зло и Говнокод. Говнокод любой, так же имеет полное право на жизнь. Ты путаешь причину со следствием.

                    Цитата OpenGL @
                    Ты сам посчитаешь, сколько раз я говорил, что я не пишу на Си, поэтому самое частое применение goto - прыжок к очистке - мне не нужен, или это сделать мне?

                    Слушай, мне уже интересно даже стало - на чем же ты пишешь? В С++ что нет goto? Да блин goto наверное разве что в sql каком нибудь и в функциональных языках нет. А в импирических он помоему везде есть. Когда писал на Си, ты же говорил что писал на Си - почему не прыгал из циклов? Не применял goto? Как же так?

                    Цитата OpenGL @
                    Внимание, вопрос - кто тут говорит, что надо писать программу, везде пихая goto? :D

                    Вы говорите. Даже придумали шаблон какой то. В вашем мире почти в каждой программе приходится прыгать из вложенных функций в конец функции для очистки ресурсов и т.п.

                    Цитата OpenGL @
                    Вау. А венгерский алгоритм, алгоритм Флойда или вышеописанная мной задача, где я "использовал" goto - перебор всех аргументов в функции f(x, y, z) ты тоже будешь разбивать на функции? :crazy:

                    Так я же написал - в 95% случаях я не юзаю больше двух вложенных циклов, но есть места - где юзаю, либо от лени, либо от специфики задачи. Что не понятно то?

                    Цитата OpenGL @
                    А что такого? Я считаю, что юзать goto там, где он к месту - нормально. Можно даже усилить - юзать %something% там, где оно к месту - нормально. Ну а почему я сам это не делаю - на это может быть тысяча причин. Или ты делаешь всё, что считаешь нормальным? :crazy:

                    Ага, только вот на практике таких мест нету. И привести такие места вы не в состоянии, ну разве что только велосипедами.

                    Цитата OpenGL @
                    Я в курсе, что ты это говорил, но поскольку ты старательно пытаешься доказать, что goto, когда оно в тему, на самом деле всё ухудшает - я просто записал эту твою фразу в обычное балабольство :D

                    Вся проблема в том, что "тут goto в тему" - это утопия. Это вымышленный рай для наркомана. Понимаешь? В теории может быть и есть такие места, а на практике их нет, есть либо лень, либо безысходность от того, что кто то вот так все криво написал, и времени переписывать у тебя нет. Но это не значит что это хорошее место для использования goto, это значит что это плохое место в принципе, и просто не хватило времени/сил/желания от него избавится и придется потом жить с этим всю оставшуюся жизнь!

                    Добавлено
                    Цитата JoeUser @
                    Но оверхед на проверках явный.

                    Ага, а то что там Sleep(1) стоит в цикле - тебя значит нисколько не смутило? :D
                      Цитата KILLER @
                      Ага, а то что там Sleep(1) стоит в цикле - тебя значит нисколько не смутило?

                      Мы же говорим о количестве операций, а не о времени. Я не знаю как там реализован слип, но в реализации без goto необоснованно больше тратятся энергоресурсы нашей планеты! 8-)
                        Цитата D_KEY @
                        Но на работе я бы вообще сделал шаг назад и посмотрел на другие варианты решения вцелом.

                        Ну так одно дело переписывать уже существующий код, и другое дело писать с нуля. Существующий код - всегда сложнее модернизировать(особенно если не ты автор), чем переписать с нуля. У меня была лишь цель избавится от goto любыми способами, более менее приемлемыми. Как только выкинул из цикла сохранение в файл, тут же стал понятен алгоритм работы программы, и в голову начали лезть мысли, как это все можно переписать без goto.
                          Цитата D_KEY @
                          Но на работе я бы вообще сделал шаг назад и посмотрел на другие варианты решения вцелом.

                          "Другие варианты" решения описанной задачи в студию :-?

                          Цитата D_KEY @
                          Зато с использованием уже проблем не будет, там будет ясно, что и зачем делается

                          Ога, вот только выглядеть в целом будет всё как-то так :crazy: Городить некий итератор, нужный только в одном месте и который менее читаемый, чем вариант втупую - глупость уровня Кили.
                            Цитата OpenGL @
                            "Другие варианты" решения описанной задачи в студию :-?

                            Слегка убрал оверхед до одной лишней проверки :)

                            ExpandedWrap disabled
                              #include <iostream>
                              #include <fstream>
                               
                              using namespace std;
                               
                              bool NeedRestore() {
                                ifstream f("saved.txt");
                                return f.good();
                              }
                               
                              void FuncSave(const int a, const int b, const int c) {
                                ofstream f("saved.txt");
                                f << a << "\n" << b << "\n" << c;
                              }
                               
                              void FuncRestore(int& a, int& b, int& c) {
                                ifstream f("saved.txt");
                                cout << "Восстанавливаемся и продолжаем ..." << endl;
                                f >> a >> b >> c;
                              }
                               
                              int main() {
                                bool R = NeedRestore();
                                for(int i=0; i<5; i++) {
                                  for(int j=i; j<5; j++) {
                                    for(int k=j; k<5; k++) {
                                      if (R) {
                                        FuncRestore(i,j,k);
                                        R = false;
                                        continue;
                                      }
                                      // делаем важное дело
                                      cout << i << ":" << j << ":" << k << endl;
                                      // эмуляция прерывания
                                      if (i==2 && j==2 && k==2) {
                                        cout << "Прервемся на 2:2:2 и сохраняемся" << endl;
                                        FuncSave(i,j,k);
                                        return 0;
                                      }
                                    }
                                  }
                                }
                                return 0;
                              }
                              О, Киля проснулся. И как обычно - несёт какую-то чушь, на которую уже были даны ответы :lool:

                              Цитата KILLER @
                              Слушай, а хорошую ты позицию занял, выдумал какую то хрень, и топишь за нее. cppasm почему то не догадался придраться к тому, к чему придрался ты.

                              Он придрался ровно к тому же, что и я, просто у кого-то с пониманием контекста проблемы :D

                              Цитата KILLER @
                              Хорошо написанный код - я бы понял сразу, просто кинув взгляд(за исключением алгоритмов и разных вычислений). Тут нужно метку искать по коду глазами, и пока ты не найдешь все метки глазами - ты не поймешь что там происодит.

                              Зачем её искать? Инструкция goto ok - очевидно, означает переход к варианту, когда ок. Тебе не очевидно? Могу только посочувствовать твоей альтернативной понятливости :D

                              Цитата KILLER @
                              Я не отрицал что может и найти. Я утверждал что goto - зло и Говнокод. Говнокод любой, так же имеет полное право на жизнь. Ты путаешь причину со следствием.

                              Имеет, но приводимые тут примеры к говнокоду не относятся - более понятно ты их не напишешь.

                              Цитата KILLER @
                              Вы говорите. Даже придумали шаблон какой то. В вашем мире почти в каждой программе приходится прыгать из вложенных функций в конец функции для очистки ресурсов и т.п.

                              Вообще-то таки есть - почти в каждой. Вот только почти каждая программа пишется на языках, где есть finally, деструкторы или defer-ы, из-за чего ... а впрочем, это уже минимум четвёртый раз в теме говорится, до тебя один фиг не дойдёт это :D

                              Цитата KILLER @
                              Слушай, мне уже интересно даже стало - на чем же ты пишешь? В С++ что нет goto? Да блин goto наверное разве что в sql каком нибудь и в функциональных языках нет. А в импирических он помоему везде есть. Когда писал на Си, ты же говорил что писал на Си - почему не прыгал из циклов? Не применял goto? Как же так?

                              :crazy:
                              Киля, если ты прочитаешь тот пост, на который ты отвечаешь, то на вопросы - почему я не юзал goto в си и почему не юзаю сейчас - ты увидишь. Ты, конечно, не особо понятливый, но на это уж тебя должно хватить :D

                              Цитата KILLER @
                              Ага, только вот на практике таких мест нету. И привести такие места вы не в состоянии, ну разве что только велосипедами.

                              Ну давай посчитаем, какие примеры тут приводили
                              1) Выход из множественных циклов. Очевидно, решается без goto не всегда - вынос в отдельную функцию может быть неудобен, если цикл внутри юзает много переменных, локальных для функции, где лежит этот множественный цикл. Ситуация нечастая, но бывает.
                              2) Переход к очистке ресурсов. Вынос в отдельную функцию неудобен по той же причине, что и предыдущий пункт, а do..while мало того, что вырвиглазный и создаёт дополнительный отступ, так ещё и помешает выходить из циклов. Вывод - в си не решается без attribute cleanup и прочих нестандартных расширений в принципе. По-моему самый частый случай его использования, так что неудивительно, что переход к другому языку, убирая необходимость в этом самом частом частом использовании, практически полностью убирает необходимость в самом goto.
                              3) Пример Qraizer-а. Никто, включая тебя, более понятный код не написал.
                              4) Примеры с различных известных сишных проектов и, особенно, "первая функция с goto" из исходников nginx. Может быть переписана без него, но за счёт копипаста с вызовом return other_function(some_parameters), что менее читаемо - понять, в каких случаях функция вернёт ok, будет сложнее, чем в текущем варианте. Но, впрочем, конкретный вариант без goto усложняется не сильно - можно считать его приемлемым, если тебе от этого будет легче.
                                Цитата OpenGL @
                                Он придрался ровно к тому же, что и я, просто у кого-то с пониманием контекста проблемы :D

                                Хорошо, если там будет мега лютая логика - я заведу флаг выхода из цикла и вставлю проверку - если мы не выпрыгнули из вложенного цикла, значит будет выполнятся код за циклом, иначе клинап и выход.
                                Ты можешь сказать - что там может быть мешанина из кода и будет все запутано. На что я отвечу, если будет такая мешанина, значит я код за циклом и до очистки - вынесу в отдельную функцию, тогда будет все понятно. Так сложно гадать на велосипедах что там будет. Но то, до чего ты прицепился - абсолютно не существенная проблема.

                                Цитата OpenGL @
                                Зачем её искать? Инструкция goto ok - очевидно, означает переход к варианту, когда ок. Тебе не очевидно? Могу только посочувствовать твоей альтернативной понятливости :D

                                В самом переходе - нет ничего плохо, я имею ввиду в конструкции goto label, проблема не в самом переходе, а в месте куда ты переходишь, то есть в самой метке. Вот в ней проблема, именно она и создает неочевидности. Сама же конструкция goto label - ничего криминального в себе не имеет, она подобна break/return/еще чему то подобному.
                                В случае с циклами - там есть блоки! Сейчас любая среда разработки позволяет без потери контеста прыгать по блокам, нажатием 1-2 кнопок, а с меткой не так. Тебе ее во первых нужно сначало найти глазами, если функция большая и запутанная - ты будешь ее искать поиском, если файл на 5 тысяч строк, и метка одна на функцию, но есть такая же в других функциях - ты по поиск тупо вылетишь за контекст функции.
                                Если бы IDE позволяли двиг аться по меткам как например по блокам - я думаю его говнокодность тут же бы упала на 50% как минимум. А IDE даже не подсвечивают метку, я уж не говорю о том, чтоб по ним можно было перемещаться. Да ты можешь сказать что в большинстве IDE есть закладки(bookmarks), которые можно поставить на метки. Но ведь - это лишняя работа, которая занимает время и отвлекает.

                                Цитата OpenGL @
                                Имеет, но приводимые тут примеры к говнокоду не относятся - более понятно ты их не напишешь.

                                Потому что это велосипеды.

                                Цитата OpenGL @
                                Вообще-то таки есть - почти в каждой. Вот только почти каждая программа пишется на языках, где есть finally, деструкторы или defer-ы, из-за чего ... а впрочем, это уже минимум четвёртый раз в теме говорится, до тебя один фиг не дойдёт это :D

                                Нет, ты передергиваешь, речь не о return'ах каких нибудь, потому что return'ом ты вылетишь в другую функцию, а с помощью меток ты можешь сделать сложный цикл. И что там намудрил автор юзая метки - еще понять нужно, а полагаться на то, что все будут использовать goto только так чтоб все было понятно - глупо.

                                Цитата OpenGL @
                                Киля, если ты прочитаешь тот пост, на который ты отвечаешь, то на вопросы - почему я не юзал goto в си и почему не юзаю сейчас - ты увидишь. Ты, конечно, не особо понятливый, но на это уж тебя должно хватить :D

                                Ты не переживай. Я читал, и понял. Потому что ты не сталкивался с такими ситуациями. И не столкнешься в 99.9999% случаев в будущем. Именно по этому goto зло. А когда столкнешься - то это будет исключительный случай. У майкрософта же - метки используются везде где нужно или нет. Ты когда будешь писать такой код, который пишут они 100% метки не будешь использовать, ровно как и любой другой вменяемый разработчик.

                                Цитата OpenGL @
                                Ну давай посчитаем, какие примеры тут приводили

                                Это все велосипеды и надуманные примеры. В реальности таких ситуаций ни у меня, ни у тебя не возникало.

                                Цитата OpenGL @
                                4) Примеры с различных известных сишных проектов и, особенно, "первая функция с goto" из исходников nginx.

                                Потому что это они так написали, а не потому что там goto просится. Именно по этому вы и приводите эти примеры.

                                Добавлено
                                Цитата JoeUser @
                                Слегка убрал оверхед до одной лишней проверки :)

                                У тебя из за continue выходит не хилый оверхед. На сколько я помню - continue - дорогая операция в цикле, и ее нужно избегать.

                                Добавлено
                                Ну хотя он там выполняется 1 раз всего. В принципе ниче в нем криминального нет. Я просто не доглядел. Думал он там всегда выполняется.
                                Сообщение отредактировано: KILLER -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (12) « Первая ... 5 6 [7] 8 9 ...  11 12 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0665 ]   [ 17 queries used ]   [ Generated: 30.04.24, 18:00 GMT ]