1. Pascal / Говнокод #13210

    +76

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    function IPP (var i: integer): integer;
    begin
      Result := i;
      Inc(i);
    end;

    Запостил: TarasB, 21 Июня 2013

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

    • показать все, что скрытоТоварищи, помогите пожалуйста зафлудить сайт vbbook.ru! Жутко быдлокодят, сил нет. А админ там - священник((

      //это не спам. Просто чтобы побольше людей увидело. Не удаляйте, пожалуйста.
      Ответить
      • Грех большой, сын мой. Накладываю на тебя епитимью, триста раз прочти Отче наш перед сном и сто земных поклонов.
        Ответить
      • даже для меня, ярого сатаниста, грех мелко пакостничать слугам Яхве.
        Ответить
        • Какая церковь даёт свет?
          Ответить
          • церковь?
            или вы имели ввиду храм?
            Ответить
            • Долой мелкие пакости! Да не попадём мы во власть мелкого пакостника-трансвестита Локи!
              Один наш бог! Сожги храм во имя Одина!!!
              Ответить
              • Отставить. Именем Люцифера запрещаю распри на религиозной почве.
                Это недостойно нас.
                Ответить
            • Строение, конечно же.
              Ответить
              • электрический свет продолжает наш день
                и коробка спичек пуста,
                но на кухне синим цветком горит газ.

                или вам нужен тот свет, что учение, а неучение - приятный полумрак?
                Ответить
      • К сожалению или к счастью, я даже их чатик зафлудить не могу, ибо молитва священника оберегает его:
        Fatal error: Call to a member function next() on a non-object in /var/www/ox2/data/www/#########/chat/inc/config.php on line 82
        Ответить
    • > А админ там - священник

      Вашего родителя-комиссара дьячок невозбранно перекрестил, и с тех пор на семейном древе назаживающая рана?
      Ответить
    • hui := IPP(hui);
      Ответить
    • Извращенцы так не пишут. Смотрите, как надо:
      uses Windows;
      
      function IPP (var i: integer): integer;
      begin
        Result := i;
        InterlockedIncrement(i)
      end;
      Или вообще в одну строку:
      Result := InterlockedExchangeAdd(i, 1)
      Ответить
      • Твой первый вариант не атомарный (хотя это и не требовалось, но не красиво).
        Ответить
        • Result := InterlockedIncrement(i) - 1

          Как-то так это можно реализовать атомарно, если юзать именно эту функцию.
          Ответить
    • Кстати, никто не заметил, что Си проигрывает Паскалю, потому что в Си return должен быть последней операцией? Для реализации аналогичного функционала придётся либо заводить временную переменную, либо писать return (i - 1), что говно по сравнению с интуитивно понятным паскалевским кодом, лишённым избыточности.
      Ответить
      • А теперь расскажи, друже, как в Паскале организовать tail-call optimization?
        Как здесь: http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/io/scsi/targets/sd.c#11508
        Ответить
        • Она и в Си без манипуляций со стеком не всегда возможна. Потребуется соглашение вызова cdecl и совпадение хотя бы части параметров либо передача аргументов через регистры. А вменяемые компиляторы должны сделать inline.

          В чём вопрос? В возможности/невозможности реализации такой оптимизации в кодогенераторе?
          Ответить
      • > в Си return должен быть последней операцией.
        С чего это вдруг?
        Ответить
        • http://ideone.com/itaMAu

          Вот и я не знаю, с чего это вдруг вторая строка не выводится.
          Ответить
        • Он, вероятно, хотел сказать, что при выполнении return функция завершит свою работу, то есть будет последней выполненной операцией. Просто выразился неточно.
          Ответить
          • Надо же: выключение питания последняя операция, которую делает компьютер...
            Ответить
            • Выпускание дымка - последняя операция, которую делает процессор.
              Ответить
              • дымовой тест обычно в самом начале проходят... или не проходят
                Ответить
      • Меня раньше это убивало, я не понимал принцип и всегда создавал временную переменную. Но потом разобрался.
        Ответить
    • I++
      Уж в дельфе небось это ещё больше UB, чем в крестах.
      Ответить
    • еще mmi, imm, ppi.
      при очень частых вызовах будут тормоза из-за стека. лучше добавить inline, если поддерживается
      Ответить
    • Ненадёжно. Лучше так:
      function IPP (var i: integer): integer;
      begin
        Result := i;
        repeat
          Inc(i)
        until i = Result + 1
      end;
      Ответить
    • Ну еще бы. Мало ли что там, на стеке.
      Ответить

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