1. C++ / Говнокод #13022

    +31

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    for (int i = 1; i++; i <= 20) {
        if (ExecSQL(...) >= 0) {
            Ok_rekord=true;
            break;
        }
        if (i == 20) {
            if (ExecSQL(...) < 0) {
                // показываем сообщение об ошибке
            } else {
                Ok_rekord=true;
            }
        }
    }

    Вот такой вот цикл для повтора при дедлоке...

    Запостил: bormand, 20 Мая 2013

    Комментарии (57) RSS

    • А условие цикла так и задумывалось, или это опечатка?
      Ответить
      • Вот из-за цикла и выложил.

        P.S. Кто-то уже минусов понаставил, не осилив цикл, и подумав что тут все ок ;)
        Ответить
        • int TryExecSQL()
          {
            int count = 1;
            while(ExecSQL(...)<0)
            {
               if(count==20) return -1;
               count++;
            }
            return 1;
          }
          Ответить
          • слишком многословно
            Ответить
            • Рефакторинг написанного выше.
              Ответить
              • for (unsigned tries = 0; tries < max_exec_sql_tries; ++tries) {
                    if (ExecSQL(...) >= 0)
                        return true;
                }
                return false;
                Ответить
              • >Рефакторинг написанного выше.
                Вообще-то исходный "цыкол" не закончится при i==20. Если опираться на i, то он закончится когда i переполнится, а потом прибежит в ноль через отрицательные значения.
                P.S. при это я нихуя не понял почему так: https://ideone.com/wngs0w
                Ответить
                • Потому что условие не правильно написано.
                  В нормальном цикле сначала идет условие, а потом действие, если это условие еще действительно. Но тут, мы бесконечно инкрементим переменную i.
                  Ответить
                  • вообще-то он про другое
                    char вместо того, чтобы перевалить 127 > -128 .. > 0, или на крайняк 255 > 0, херачит дальше, как будто он int
                    беда ideone в том, что неизвестно на каких ключах это компилилось, а сидеть подбирать (наверняка в гцц есть флаг считать char интом) мне пока лень
                    Ответить
                    • Разве после первого приведения i не останется дальше интом? Там ведь нет обратного приведения к чару, только инкремент, так что ничего удивительного.
                      Ответить
                      • приведение на исходную переменную не влияет
                        Ответить
                        • показать все, что скрытоКак это не влияет? Вы же исходную переменную приводите к этому типу?
                          Ответить
                          • y=2
                            x = y*y
                            Чему равно игрек? Конечно же, 4, ведь я же игрек возвёл в квадрат!
                            Ответить
                            • Некорректный пример. Вы тут явно присваиваете значение операции.
                              Следуя вашей логике могу написать i++ и ткнуть вас носом в увеличение игрека.
                              Но вы правы, это не из-за операции, а косяк компилятора. В VS все нормально.
                              Ответить
                              • y = 2;
                                cout<<y*y
                                Чему равно игрек? Конечно же, 4, ведь я же игрек возвёл в квадрат!
                                И ещё я явно не присваивал значение операции!
                                Ответить
                                • y = 2;
                                  cout<<y++
                                  Чему равно игрек? Конечно же, 2, ведь я же игреку не присвоил значение!

                                  Различные операции, че пристал ко мне. Ну ошибся человек и?
                                  Ответить
                                  • > Чему равно игрек? Конечно же, 2, ведь я же игреку не присвоил значение!

                                    Нихуя, тут ты использовал игрек как левалуй.

                                    > Ну ошибся человек и?

                                    Мне показалось, ты не понимаешь основы.
                                    Ответить
                                    • >>Нихуя, тут ты использовал игрек как левалуй.
                                      Просто потому, что ты об этом уже знаешь. Знаешь, как сработает компилятор в данном случае.
                                      Логично предположить, что и в предыдущем случае компилятор сработает как надо, но он не сработал как надо, поэтому я просто сделал предположение, почему компилятор сработал именно так. По моему, все симптомы говорят о том, что i скастонулся в int.
                                      Ответить
                                      • ок защитываю
                                        не нихера не защитываю, ты говорил об этом не как о предполагаемой причине бага, а как о "ничего удивительного"
                                        Ответить
                                        • Я сначала не думал, что это баг.
                                          Но позже признал ошибку:
                                          [color=blue]Но вы правы, это не из-за операции, а косяк компилятора. В VS все нормально.[color]
                                          Ответить
                                          • >>Но вы правы, это не из-за операции, а косяк компилятора. В VS все нормально.
                                            Ответить
                                            • есть же "редактировать", время то не вышло еще
                                              Ответить
                                              • @defecate-plusplus
                                                Я там другую ошибку исправлял и не заметил как допустил эту. :)

                                                А редактировать можно только раз. В общем внимательность после работы на минимуме.
                                                Ответить
                                                • > А редактировать можно только раз.
                                                  f5 в помощь
                                                  Ответить
                                                  • не понял про f5. Команда страничку же только перегрузит?

                                                    Имеете ввиду возможность отменить изменения внесенные в поле? Я имел ввиду возможность второго редактирования после коммита первого изменения.
                                                    Ответить
                                                    • > не понял про f5.
                                                      редактировать комментарий можно в течение минут 5 по факту (а не 1 раз).
                                                      Если время еще не вышло, а возможности редактирования как бы нет, обновите страницу и она появится. Это такая фича ГК :)
                                                      Ответить
                    • т.е. банальной проверки std::numeric_limits<char>::max()/min() не достаточно?
                      >беда ideone в том,
                      так liveworkspace "under maintenance" :(
                      Ответить
                      • ха-ха: https://ideone.com/5z7GGu
                        Ответить
                      • очевидно, это очередной баг гцц
                        шланг нормально разобрался с таким циклом
                        ну и, понятное дело, студия тоже ок
                        http://goo.gl/RBEMO
                        Ответить
                        • ссылочка какая-то странная ... открывает последний локальный код, который был в редакторе
                          Ответить
                          • там должен быть minimal example с printf, чтобы не распухал асм-выхлоп
                            сравни цикл от шланга (testb %bl, %bl) и бесконечный цикл от гцц
                            Ответить
                            • поправка к предыдущему - бесконечный цикл от гцц 4.7
                              гцц 4.8 уже разбирается с проблемой

                              гцц 4.7:
                              .L2:
                              	movl	%ebx, %edx
                              	movl	$.LC0, %esi
                              	movl	$1, %edi
                              	xorl	%eax, %eax
                              	addl	$1, %ebx
                              	call	__printf_chk
                              	jmp	.L2

                              гцц 4.8:
                              .L3:
                              	movsbl	%bl, %edx
                              	xorl	%eax, %eax
                              	movl	$.LC0, %esi
                              	movl	$1, %edi
                              	addl	$1, %ebx
                              	call	__printf_chk
                              	cmpb	$1, %bl
                              	jne	.L3
                              Ответить
                              • а я смотрел на 4.8. и не вкуривал: где бесконечный цикл.
                                Ответить
                              • странно: у меня на домашней убунте 4.7.2 не зацикливается.
                                Ответить
                                • футболка сухая и совсем не пахнет

                                  -S вроде флаг
                                  Ответить
                                  • .L3:
                                    	movsbl	-1(%rbp), %eax
                                    	movl	%eax, %esi
                                    	movl	$.LC0, %edi
                                    	movl	$0, %eax
                                    	call	printf
                                    .L2:
                                    	cmpb	$0, -1(%rbp)
                                    	setne	%al
                                    	addb	$1, -1(%rbp)
                                    	testb	%al, %al
                                    	jne	.L3

                                    #include <cstdio>
                                    int main()
                                    {
                                       for( char i=1; i++; )
                                       {
                                          printf( "%d\n", i );
                                       }
                                       return 0;
                                    }
                                    Ответить
                • Да это же гццблядский баг какой-то! Ну как это int , полученный из char, может быть больше 255?
                  Ответить
    • Последняя попытка? А чё нельзя было 21 написать.
      Ну и цикл да, такой цикл. Сишкоблядская форма for всё-таки дерьмо, что ни говори. 99% случаев в ней используется ++ или -- между двумя значениями, но ради "универсальности", нужной в 1% случаев, сделали неудобную хуйню, в которой можно вот так вот лажануться.
      Ответить
      • Ну та же история, что и со switch'ом, в котором в 99% случаев нужно писать бряк, а рассчитан он как-будто на 1% случаев, в котором управление пролетает насквозь.
        Ответить
        • Плохо учили Керниган и Ритчи теорию кодирования и Хаффмана в частности.
          На эти бряки столько бумаги и чернил перевели, столько байт лишних истратили, столько студентов проклинали сей switch.
          И сука ни один SISHKOBLYADO-based-language не отошел от этой пагубной практики
          Ответить
          • >ни один SISHKOBLYADO-based-language
            С#
            Ответить
            • ORLY?
              http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.80).aspx
              Ответить
              • Я о том, что сквозного прохода нет по кейсам.
                Ответить
                • Ну так почему тогда не пойти до логического конца и вообще бряк убрать?
                  ИМХО еще большее уродство сделали.
                  Ответить
                  • Чтобы сишкобляди при обратном переходе не баттхёртили
                    Ответить
      • а в скольких случаях из 100% можно вот так лажануться, как ОП?
        и потом еще не заметить ворнинг "результат выражения не используется"
        по мне так лучше универсальный for, работающий с любыми типами, умеющий в несколько условий завершения цикла и несколько действий при итерации, с шагом нужной длины, а не только 1
        и да, объявляющий локальный счетчик прямо в себе, а не в отдельном разделе несколькими пейджапами выше
        Ответить
        • > по мне так лучше универсальный for, работающий с любыми типами, умеющий в несколько условий завершения цикла и несколько действий при итерации, с шагом нужной длины, а не только 1
          и да, объявляющий локальный счетчик прямо в себе, а не в отдельном разделе несколькими пейджапами выше

          "по мне лучше универсальный гото который многа многа букав"...

          Про счётчик не понял
          Во-первых, вопрос расположения объявления счётчика перпендикулярен вопросу хуёвочитаемого и труднонаписуемого заголовка, и да, я в двойном цикле несколько раз лажался в
          for (int i=0; i<20; ++i) for (int j=0; i<10; ++i)
          безо всяких нахуй предупреждений от компилятора. Почему я так лажался? Ну так пальцы затачиваются под конкретный сочетания символов.
          Вот даже сейчас я спутал падеж у прилагательного, по той же причина.
          *причине

          Во-вторых, в Аде счётчик объявляется на месте, тип не указывается.
          Ответить
          • for i in xrange(20):
                for j in xrange(10):
                    lol()
            Ответить
            • ага, на с++11 тоже можно нечто подобное
              будет навроде
              for (auto i: boost::irange(0, 20))
                  for (auto j: boost::irange(0, 10))
                      lol();
              черт, когда же LWS починят уже!
              Ответить
              • > когда же LWS починят уже!
                Мы тебе верим!

                Был тут эпичный тред, начавшийся поломанными генераторами в хацкиле а закончившийся отсосом практически всех языков, допускающих floatы в диапазонах.
                Ответить
              • сегодня кстати и ideone сбоит
                Ответить
          • несколько условий завершения цикла, произвольный шаг
            for (int i = 0; i > 10 && (some % 3) == 0; some = get_next_random(some), i += 2)

            на паскале тебе придется для этого писать while, что, внезапно, не очень удобно (перенос инкрементов в хвост), особенно, когда наступит нужда использовать continue - вместо continue понадобится чуть ли не goto на строчки с инкрементами

            вот так вот универсальный for работает, как ему и положено

            ну а теперь есть еще и for (auto i: where), что тоже неплохо
            Ответить
            • > несколько условий завершения цикла

              Я об этом и сказал, как в 1%.
              Хотя не, нихуя, я в таких случаях дополнительные условия проверяю внутри с оператором break. У меня быдлизьм?

              > произвольный шаг

              А вот это в натуре 1%. Серьёзно.
              Ответить
              • на самом деле итерация целыми числами - это как раз даже не 50%
                только в лабах это 100%, в продакшене это обычно итерация по контейнерам (да, там шаг ++iterator, кстати, умеет ли в это делфи?) или еще что-то более мутное навроде
                for (xml_node isrcreq = src_root.child(request::tag); isrcreq; isrcreq = isrcreq.next_sibling(request::tag))
                целочисленные с произвольным шагом - разные блочные алгоритмы, типа шифрования/дешифрования
                Ответить
                • > в продакшене это обычно итерация по контейнерам
                  Итерация по контейнерам - это то же самое
                  for (smth = start; smth<end; ++smth) операторы < и ++ перегружены
                  for (smth in [start..end])... удобнее же
                  Язык должен поддерживать эту фичу для любых объектов, допускающих эти операции.

                  > целочисленные с произвольным шагом - разные блочные алгоритмы, типа шифрования/дешифрования
                  Шаг одинаковый весь цикл? Часто я снаружи оставляю i, внутри использую i*2, как-то так.
                  Ответить

    Добавить комментарий