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

    +97

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    Сегодня был приятно удивлен тем, что цикл
    
    for i:=0 to memo1.lines.count -1 do
    ...
    
    приостанавливает работу, когда идет обращение к мемо (пользователь выделяет текст или печатает в этом мемо) до тех пор, пока идет обращение. 
    Очевидно, это такая фишка компилятора. Приятно, когда компилятор прикрывает спину.

    Запостил: Stertor, 10 Августа 2013

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

    • Мне очень жаль, но как только список опубликованных мной кодов приблизится к 99, придется менять аккаунт, иначе я запишу себя в г...кодеры(( Возможно смешно звучит, но для меня это очень серьезно. Мое больное самолюбие не переживет такого удара.
      Ответить
    • показать все, что скрыто`for i:=0 to memo1.lines.count -1 do` - вот по этому дельфа/vlc и есть маздай.

      безобидно выглядещее `memo1.lines.count` скорее всего делает SendMessage() который само собой разумеется подвисает (скорее всего лок) когда WndProc() уже обрабатывает какое-то сообщение.
      Ответить
      • показать все, что скрытоВидно поэтому программировать учатся в консолечке и только потом начинают лепить гуй?
        Ответить
        • работа с консолью приучивает держать модель данных в голове. и на экран выводить без лишнего мусора.

          как по мне - да, начинать с консоли имеет смысл.

          хотя, зная как поверхностно обучение программированию в некоторых местах идет, консолью новичкам могут желание отобить учить программирование.
          Ответить
          • Консоль гораздо проще гуя, там не надо знать, что такое многопоточность, как устроена работа используемого гуй фрейверка, консолечка же везде одна. Вопросы типа ТСовского, на который человек, учащий язык сам, один ответить не сможет, там возникают гораздо реже. Также от гуя может развиться заболевание "весь код программы в обработчике события кнопки" (об этом даже статья в педивикии есть), о структуре программы тут говорить не приходится.

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

                D
                Ответить
                • демоны.
                  Ответить
                  • cleaned
                    Ответить
                    • Соль в двух вилках.
                      Ответить
                      • Hint: двумя вызовами fork() программу можно отвязать от управляющего терминала.
                        Ответить
                    • Не сострил, а сыграл роль Капитана Очевидность.

                      Соль: http://en.wikipedia.org/wiki/Daemon_%28computing%29

                      P.S. По виндовой терминологии - служба.
                      Ответить
                      • А-а-а! Спс, кэп. Но просто неожиданный какой-то поворот: сидели, вроде, в столовой, а оказались в трансформаторной будке.
                        Ответить
                  • а ещё всякая хрень типа сервлетов
                    Ответить
        • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

          [email protected] (Спросить Тараса)
          Ответить
      • оно это делает только один раз перед циклом, а потом запоминает значение
        Ответить
    • Стертор наконпелял многопоточного бота-минусатора?
      Ответить
      • Однопоточного. Причем бот у меня -объектный класс. Есть методы (без кавычек буду писать ибо спешу, сорри) Login, SetProxy, VoteOn,VoteAgainst,KeepCookie,Disconnect . Свойства ProxyPort,ProxyServer,Username,Password, TopID,IsComment,(если не тру - значит, топик). Не хочу бравировать, но пусть все видят, я не только теоретик. Могу и ручками кое что делать. В принципе можно вызывать этот класс и из потока, но смысла нет. Инет у меня скорый.
        Ответить
        • А несколькими аккаунтами как работаешь?

          Можно устроить обмен исходниками. Мой на питоне.
          Ответить
          • >>Можно устроить обмен исходниками. Мой на питоне.
            А не пошел бы ты в жопу?
            D
            Ответить
            • >>А несколькими аккаунтами как работаешь?
              var aBot:array[1..10] of TBot;
              begin
              //создаем и настраиваем экземпляр бота

              abot[1].VoteAgainst;
              abot[1].KeepCookie;
              abot[1].Free;

              Класс Бота базируется на IdHTTP. Объект создается автономно.
              Куки-менеджер тоже создается автономно , т.е для каждого бота свой.
              Ответить
              • Работают они последовательно?
                Ответить
                • >>Работают они последовательно?

                  я сделаю вид, что не читал этого.
                  Ответить
                  • А что тут такого? Они работают или последовательно, или параллельно. Тредов я у тебя не видел.
                    Ответить
                    • >>Тредов я у тебя не видел.

                      И не увидишь.
                      Ответить
            • Не хочешь - как хочешь, лол.
              Ответить
              • >>Не хочешь - как хочешь
                Вспомни, сколько я за тобой бегал, выпрашивая исходники. А ты мало того, что не поделился, так еще и наебал меня - не написал лс, хотя обещал. С моей стороны отношение будет соответствующим.
                Ответить
                • Может, ты еще расскажешь, как тут лс писать? Алсо мы оба сидим под общими аккаунтами.

                  Сейчас речь идет об обмене, ситуация другая. И да, не хочешь - мне похуй.
                  Ответить
                  • >>Может, ты еще расскажешь, как тут лс писать?
                    Лс в данном случае - письмо мне на почту.
                    Исходники не дам: зачем? Чтобы ты впоследствие меня минусовал? Могу помочь с разработкой. Что тебя интересует?
                    Ответить
                    • Как мило: встретились две родственных души.А до первого сентября, уже менее месяца.
                      Ответить
                      • А у Вас, милостивый государь, на фоне этого развилась амфибиогенная асфиксия? Похвально, похвально!..
                        Ответить
                    • Я тебя и так заминусовать могу, лолка. А как тут на почту писать?
                      Ответить
                  • Минусуют только нас с тобой( Я могу дать тебе скомпилированную прогу. Если устраивает, пиши на почту. [email protected]
                    Сюда по понятным причинам не могу выложить ссылку, а то мою программу использую против меня.
                    Ответить
                    • Мне твоя прога не нужна, мне просто ради интереса исходники хочется посмотреть.
                      Ответить
                    • > а то мою программу использую против меня
                      Т.е. ты считаешь, что ты не Неуловимый Джо, и кто-то будет тебя минусовать? :)

                      Мне вот, к примеру, просто лень регать десяток ботов ради этого бессмысленного минусяторства. А прога... да она пишется отсилы полчаса вместе с отладкой. Просто я не вижу в этом смысла.

                      Так что аноним прав, если и поюзают для чего-то твою прогу - просто почитать исходниики для интереса.
                      Ответить
                      • Бля, анонимб, тебе сложно написать мне на почту?
                        Ответить
                        • На, пожалуйста, скачивайте:

                          http://rghost.ru/48083698
                          пароль - 1600

                          А то еще подумаете, что я - гондон. Нет, батеньки мои. Я люблю пофлудить и потроллить, но гондоном я никогда не был.
                          Ответить
                      • s/для интереса/и выложить особо вкусные куски здесь/
                        Ответить
      • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

        [email protected] (Спросить Тараса)
        Ответить
    • Нихрена компилятор никого не защищает:
      1. Приостанавливает работу код TMemo (или что там у нас) из библиотеки VCL. Библиотека не компилятор. Сердце не камень, работа не волк, все лгут.
      2. Цикл ни при чём. Я уже писал, что цикл for в потомках Турбо Паскаля отличается от сишного тем, что интервал счётчика вычисляет только один раз.
      Ответить
      • Ну, все таки я думаю что это правильнее. Читать строки в цикле с не ридонли мемо - уже идиотизм (за исключением когда нужно считать строки например в tstringlist - это делается за мгновения), а если цикл замедленный (в моем случае прога читает строку и отправляет запрос на сайт. Задержка как минимум 10-20 сек)-то, что цикл приостанавливается лучше - в итоге будет прочитан текст с момента последней модификацией. Пусть пользователь пока разберется, что он хочет, а мы подождем-с.
        Ответить
        • >>интервал счётчика вычисляет только один раз.

          Если честно, не понял. Просвети?
          Ответить
          • http://govnokod.ru/13280

            Значение выражения memo1.lines.count - 1 будет посчитано один раз и сохранено в регистре перед началом цикла.
            Ответить
            • Значение то один раз. А вот потом, внутри цикла, он всяко лезет к тексту этой мемы. А делфя походу всего вытаскивает текст из мемы через WM_GETTEXT, который и подвисает на некоторое время. Хотя, возможно я и ошибаюсь.

              P.S. И что-то мне намекает, что тот самый memo1.lines каждый раз вытрясает из мемы текст а затем разбивает его на строки.
              Ответить
              • WM_GETTEXT гуглится в таких методах:
                function TControl.GetTextLen: Integer;
                begin
                  Result := Perform(WM_GETTEXTLENGTH, 0, 0);
                end;
                
                function TControl.GetTextBuf(Buffer: PChar; BufSize: Integer): Integer;
                begin
                  Result := Perform(WM_GETTEXT, BufSize, Longint(Buffer));
                end;
                Ответить
                • Но вызывает ли их мема?
                  Ответить
                  • Там ад и погибель с многоярусным наследованием методов. ООП специально придумали, чтобы всех запутать.
                    function TCustomEdit.GetSelTextBuf(Buffer: PChar; BufSize: Integer): Integer;
                    var
                      P: PChar;
                      StartPos: Integer;
                    begin
                      StartPos := GetSelStart;
                      Result := GetSelLength;
                      P := StrAlloc(GetTextLen + 1);
                      try
                        GetTextBuf(P, StrBufSize(P));
                        if Result >= BufSize then Result := BufSize - 1;
                        StrLCopy(Buffer, P + StartPos, Result);
                      finally
                        StrDispose(P);
                      end;
                    end;
                    
                    function TCustomEdit.GetSelText: string;
                    var
                      P: PChar;
                      SelStart, Len: Integer;
                    begin
                      SelStart := GetSelStart;
                      Len := GetSelLength;
                      SetString(Result, PChar(nil), Len);
                      if Len <> 0 then
                      begin
                        P := StrAlloc(GetTextLen + 1);
                        try
                          GetTextBuf(P, StrBufSize(P));
                          Move(P[SelStart], Pointer(Result)^, Len);
                        finally
                          StrDispose(P);
                        end;
                      end;
                    end;
                    А мема — внук TCustomEdit'а:
                    TCustomMemo = class(TCustomEdit);
                    TMemo = class(TCustomMemo);

                    Ответить
                    • Вспомните принцип, отражением которого можно назвать эту фразу: то, что удобно снаружи - сложно изнутри. Разработчики сделали все, чтобы интерфейс был как можно более удобным, но какими средствами они этого достигли -другой вопрос. К тому же не мудрено, что кое-где через анус. Снаружи ведь не видно)
                      http://www.pictureshack.ru/images/89Trololo-tonko.jpg
                      Ответить
                      • >>function TCustomEdit.GetSelText: string;
                        var
                        P: PChar;
                        SelStart, Len: Integer;
                        begin
                        SelStart := GetSelStart;
                        Len := GetSelLength;
                        SetString(Result, PChar(nil), Len);
                        if Len <> 0 then
                        begin
                        P := StrAlloc(GetTextLen + 1);
                        try
                        GetTextBuf(P, StrBufSize(P));
                        Move(P[SelStart], Pointer(Result)^, Len);
                        finally
                        StrDispose(P);
                        end;
                        end;
                        end;

                        Вспомнил, как я извращался с PureBasic, когда еще не знал дельфей.
                        Ответить
                    • > ООП специально придумали, чтобы всех запутать.
                      Царь прав, к сожалению, насчет неудобства ООП. В ООП'шных прогах легко изучать и перепиливать локальные куски, в пределах одного класса. Зато, когда надо понять причину какого-то мало-мальски сложного поведения, приходится перекапывать горы исходников.

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

                            А если вообще без наследования - все не хуже и гораздо лучше читается.
                            Ответить
                            • Статику. Про динамику молчу.

                              А если без наследования и полиморфизма, то, внезапно осталось то самое си с классами, которое любит упоминать царь ;) Использование классов только ради инкапсуляции.
                              Ответить
                              • >тип которого определяется в рантайме, в зависимости от входных данных.
                                >статика
                                Часто такое встречается? :)

                                >си с классами, которое любит упоминать царь
                                Я уж забыл - в каком тоне он это упоминает?
                                Ответить
                                • > Часто такое встречается? :)
                                  Да в любом месте, где по-настоящему поюзан полиморфизм :)

                                  > Я уж забыл - в каком тоне он это упоминает?
                                  Насколько я понимаю, что-то среднее между богомерзким с++, который царь не признает за язык, и божественной сишечкой, которую царь любит.
                                  Ответить
                                  • >Да в любом месте, где по-настоящему поюзан полиморфизм :)

                                    Ух ты, а примерчик можно, где в статике динамический тип что-то наследует? :)

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

                                      Поясните мысль. Я подозреваю, что борманд имел в виду что-то вроде
                                      shape * make_shape(shape::id id)
                                      {
                                          switch (id) {
                                          case circle::id: return new circle;
                                          case rect::id: return new rect;
                                          }
                                          throw bad_shape_id(id);
                                      }
                                      //...
                                      
                                      shape::id id = read_id_from_file();
                                      shape * s = make_shape(id);
                                      process_shape(s);
                                      Ответить
                                      • > Ух ты, а примерчик можно
                                        Да любой парсер, составляющий AST - там тип ноды зависит от прочитанных данных. И не взглянув на входные данные и процесс построения невозможно сказать, на какой именно класс ссылается некая ссылка. Известен только родительский класс/интерфейс, не более того.

                                        > Я подозреваю, что борманд имел в виду что-то вроде
                                        Ага, именно это.
                                        Ответить
                                        • И часто приходится иметь с этим дело? Писать / фиксить парсеры.
                                          Ответить
                                          • > часто приходится ... Писать / фиксить парсеры
                                            разработчикам clang - ежедневно
                                            Ответить
                                            • Ну так это проблемы 0,00000001%. Тут эти разработчики присутствуют?
                                              Ответить
                                              • Ну я приводил пример с чтением объекта из файла. Любая сериализация - десериализация по сути реализует примерно тоже самое. А данные сериализуются и десериализуются нынче ежесекундно.
                                                Ответить
                                          • > И часто приходится иметь с этим дело? Писать / фиксить парсеры.
                                            Приходилось пару раз. Но суть проблемы вы не уловили походу.

                                            Любая задача, юзающая полиморфизм, имеет точно такую же траблу. Разделяются момент создания объекта (фабрика или что-то подобное) и момент его использования. Из-за этого без отладчика/логов порой трудно понять, че там вообще создавалось и вызывалось.

                                            В точке создания совсем непонятно, что будут делать с объектом. В точке вызова совсем непонятно, что же там за объект (т.к. полиморфизм). Вот это я и хотел показать ;)
                                            Ответить
                                            • >хуй знает какого потомка, тип которого определяется в рантайме, в зависимости от входных данных.

                                              Даже если оно добавляет проблем в одном месте, оно убирает их из другого, иначе бы полиморфизмом никто не пользовался.
                                              Ответить
                                              • > Даже если оно добавляет проблем в одном месте, оно убирает их из другого
                                                Да с этим я и не спорю ;) Любая парадигма это куча компромиссов, дающих где-то удобство, где-то неудобство, а где-то полный фейл.
                                                Ответить
                                      • Это как бы не самый удачный пример того, что такое полиморфизм. За идеей полиморфизма стоит понятие заимствованое из естесственных языков о частичной зависимости семантики от контекста.
                                        В этом смысле полиморфные функции более показательны. Например:
                                        class Circle(object):
                                            def __init__(self, radius):
                                                self._radius = radius
                                        
                                            def perimeter(self):
                                                return math.pi * self._radius * 2
                                        
                                        class Square(object):
                                            def __init__(self, edge):
                                                self._edge = edge
                                        
                                            def perimeter(self):
                                                return self._edge * 4
                                        
                                        def call_polimorphic_function(shape):
                                            return shape.perimeter()

                                        Просто люди когда слышат "полиморфизм", почему-то всегда начинают думать о наследовании (хотя это не обязательно, и, вообще возможно, что в вышеприведенном примере полиморфизм не использовался - мы же не знаем, есть ли у разных фигур методы с одним именем, но разной реализацией).
                                        Ответить
                              • >>>осталось то самое си с классами, которое любит упоминать царь ;)
                                >>>Царь прав, к сожалению, насчет неудобства ООП. 

                                Нашел авторитета для цитирования.
                                Тарас об этом (oop isnt silver bullet) с самых ранних тредов твердил, когда еще сюда Пушков приходил отстаивать кресты.
                                Ответить
                                • > отстаивать кресты
                                  Кресты выпали в осадок?
                                  Ответить
                                  • То что выпадает в осадок называется отстой.

                                    Их поливают говном практически с самого основания ресурса. Это традиция кстати.
                                    Ответить
                                    • А вы тут, часом, не прихуели засорять мою паскальную тему этими вашими сишкопроблемами?
                                      Ответить
                    • Ответить
              • >P.S. И что-то мне намекает, что тот самый memo1.lines каждый раз вытрясает из мемы текст а затем разбивает его на строки.
                Нет. Lines - объект типа TMemoStrings, его метод получения строки выглядит так:
                function TMemoStrings.Get(Index: Integer): string;
                var
                  Text: array[0..4095] of Char;
                begin
                  Word((@Text)^) := SizeOf(Text);
                  SetString(Result, Text, SendMessage(Memo.Handle, EM_GETLINE, Index,
                    Longint(@Text)));
                end;
                Ответить
            • Но ведь так по идее должно работать быстрее? Зато, если размер записи уменьшился, это вызовет выход за границы((
              Ответить
      • показать все, что скрытоОтсосу член парню из Владикавказа. Прут наглые хуястые самцы.

        [email protected] (Спросить Тараса)
        Ответить
    • var
      i: integer;
      begin
      Screen.Cursor := crHourGlass;
      try
      for i := 0 to memo1.Lines.Count - 1 do
      begin
      // Здесь делаем все что нам нужно
      Application.ProcessMessages; // это не забываем делать чтоб не тормозило ))
      end;
      finally
      Screen.Cursor := crDefault;
      end;
      end;
      Ответить
    • Причем здесь компилятор? В данном случае Вы описали поведение библиотечного TMemo.
      Ответить
      • Ох, вот еще вспомнили. Тема давно закрыта.

        Ка-питан, ты слиш-ком дол-го пла-вал.
        С уважением, Ваш Стертор.
        Ответить
        • Упс. "Тема закрыта" - это я конечно погорячился, что и говорить..
          Ответить

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