Кресты / Говнокод #13022 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 bormand, (Updated )

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

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

      P.S. Кто-то уже минусов понаставил, не осилив цикл, и подумав что тут все ок 😉
      Ответить
      • int TryExecSQL()
        {
          int count = 1;
          while(ExecSQL(...)<0)
          {
             if(count==20) return -1;
             count++;
          }
          return 1;
        }
        Ответить
            • >Рефакторинг написанного выше.
              Вообще-то исходный "цыкол" не закончится при 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.
                                                    редактировать комментарий можно в течение минут 5 по факту (а не 1 раз).
                                                    Если время еще не вышло, а возможности редактирования как бы нет, обновите страницу и она появится. Это такая фича ГК 🙂
                                                    Ответить
                  • т.е. банальной проверки std::numeric_limits<char>::max()/min() не достаточно?
                    >беда ideone в том,
                    так liveworkspace "under maintenance" 🙁
                    Ответить
                      • ссылочка какая-то странная ... открывает последний локальный код, который был в редакторе
                        Ответить
                        • там должен быть 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 не зацикливается.
                              Ответить
                                • .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 не отошел от этой пагубной практики
        Ответить
    • а в скольких случаях из 100% можно вот так лажануться, как ОП?
      и потом еще не заметить ворнинг "результат выражения не используется"
      по мне так лучше универсальный for, работающий с любыми типами, умеющий в несколько условий завершения цикла и несколько действий при итерации, с шагом нужной длины, а не только 1
      и да, объявляющий локальный счетчик прямо в себе, а не в отдельном разделе несколькими пейджапами выше
      Ответить
      • > по мне так лучше универсальный for, работающий с любыми типами, умеющий в несколько условий завершения цикла и несколько действий при итерации, с шагом нужной длины, а не только 1
        и да, объявляющий локальный счетчик прямо в себе, а не в отдельном разделе несколькими пейджапами выше

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

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

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

              Был тут эпичный тред, начавшийся поломанными генераторами в хацкиле а закончившийся отсосом практически всех языков, допускающих floatы в диапазонах.
              Ответить
        • несколько условий завершения цикла, произвольный шаг
          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, как-то так.
                Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8