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

    +96

    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
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    procedure TRegistry.GetKeyNames(Strings: TStrings);
    var
      Len: DWORD;
      I: Integer;
      Info: TRegKeyInfo;
      S: string;
    begin
      Strings.Clear; // Очистить список перед добавлением. Это пиздец, как важно!!! Программист не додумается сам очистить список. 
      if GetKeyInfo(Info) then
      begin
        SetString(S, nil, Info.MaxSubKeyLen + 1);
        for I := 0 to Info.NumSubKeys - 1 do
        begin
          Len := Info.MaxSubKeyLen + 1;
          RegEnumKeyEx(CurrentKey, I, PChar(S), Len, nil, nil, nil, nil);
          Strings.Add(PChar(S));
        end;
      end;
    end;

    Из registry.pas (Delphi 2009)
    Все регистровые функции зашкварены этим, не знаю, как в семерке; это значит, что в цикле их без дерьма не поюзаешь.
    Очень обидно.

    Запостил: brutushafens, 26 Июня 2014

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

    • Привет, кто может подсказать, как разделить текстовый файл на указанное число файлов, причем количество строк в них должно быть примерно одинаковым (не лаба) ?
      Видимо, нужна какая-то мат. формула, но я в этом не силен.
      Ответить
      • Ну тут 2 варианта.

        Если на непрерывность кусков похрену - можешь рассеивать строки по файлам по кругу. Прочитал строку, засунул в первый файл, прочитал вторую - засунул во второй и т.п.

        А если куски нужны непрерывные - придется первым проходом прочесть файл и посчитать строки. Затем поделить это количество на количество файлов. Ну и вторым проходом переписывать по столько строк в каждый файл (последнему может достаться до N-1 лишних строк).

        Как-то так.
        Ответить
        • Ну можно чуть-чуть лучше баланс сделать. Если у нас есть M строк и N файлов, то в первые M mod N файлов мы пишем M div N + 1 строку, а в остальные - только M div N. Тогда погрешность будет в пределах одной строчки...
          Ответить
          • Классическая логика - добивание до прямоугольника и дальнейшее забивание. )
            Ответить
        • Помню, в RWH пример был, мне подход понравился.

          Берём размер файла, считаем размер блока ChunkSize = FileSize / N. Устанавливаем текущую позицию на 0.
          Формируем список кусков: запоминаем текущую позицию, прыгаем на ChunkSize вперёд и ищем до первого '\n'. Так получаем очередной кусок, записываем его в отдельный файл.

          Такой подход не особо хорошо работает в вырожденных случаях, но если типичный кейс - много строк примерно одинаковой длины, то самое оно. Дёшево и сердито.
          Ответить
          • простой способ улучшить - идти в обе стороны. Где \n ближе - по туда и обрезаем
            Ответить
            • Так можем получить >= N кусков, т.е. больше, чем нужно. Если идти только вперёд, можно получить только <= N кусков. Опять же, больше условий и проверок - что если поиск уткнулся в начало предыдущего куска? Чем проще - тем лучше.
              Ответить
              • нужно n файлов длина файла l
                выделяем узлы [k] k>0, k in N, k*n<=l
                -------*-------*-------*-------*-------*-------*-------*---
                [r]= [l-k]
                ---#---*---#---*---#---*---#---*---#---*---#---*---#---*---
                Область компромисса для k(i) = r(i)..r(i+1)
                иначе разделение на n файлов будет хуевым. так что спокойно можно просматривать
                (l div n)-(l mod n) в обе стороны
                Ответить
              • https://ideone.com/GcRYPw

                код на выброс
                Ответить
        • Ой, спасибо большое)
          Я вот так сделал, правильно?
          procedure TForm1.sortbtnClick(Sender: TObject);
          var
            flist:tstringlist;
            ii,jl,cp,l,i:integer;
            ct,pp:integer;
            splcnt:integer;
          begin
          
            if (trim(fnameed.Text)=emptystr) or (fileexists(fnameed.Text)=false) then
            begin
              messagebox(handle,pchar('Указанный файл не существует'),pchar('Ошибка'),0);
              exit;
            end;
          
            splcnt:=fsplited.Value;     // на сколько частей делить
            if splcnt=0 then
            begin
              messagebox(handle,pchar('Не указано количество частей'),pchar('Ошибка'),0);
              exit;
            end;
          
            tbutton(sender).Enabled:=false;
             flist:=tstringlist.Create;
            try
          
            list.LoadFromFile(fnameed.Text);
            cp:=0;
            ct:=(list.Count) div splcnt;
            pp:=0;
          
          
            for jl:=1 to splcnt do
            begin
              flist.clear;
          
              for ii:=1 to ct do
              inc(cp);
          
              try
                if (jl=splcnt) and ((list.count-pp)>ct) then
                begin
                  flist.clear;
                  for i:=pp to list.Count-1 do
                  if i=pp then
                  flist.Add(list[i])
                  else
                  flist.Add(list[i]);
                  break;
                end
                else
                begin
                for l:=pp to cp-1 do
                flist.Add(list[l]);
                pp:=cp;
                end;
              finally
                showmessage(inttostr(flist.Count-1));
                flist.SaveToFile('C:\'+inttostr(jl)+'.txt');
              end;
            end;
            finally
              tbutton(sender).Enabled:=true;
              flist.free;
            end;
          end;
          Ответить
          • > if i=pp then flist.Add(list[i]) else flist.Add(list[i]);
            Безысходность...
            Ответить
            • Ты не можешь не добавлять. А можешь и добавить!
              Ответить
      • Для начала - строка, она реально в файле есть, или в голове? Есть ли способ поделить фаил на строки? Есть способ узнать количество строк? Есть способ поделить количество строк на количество файлов? Короче ты понял.

        Формула есть a/b
        Ответить
        • Что-за философия?
          Ответить
          • Философия Жабы. Глава 32 - Жаба ест файл и сблевывает его равными частями
            Ответить
          • Вопрос к Вам, как сэра к сэру - в haskell существует что то типа junior devoloper?) Типа пройти тест, повысить чсв...
            Ответить
            • > пройти тест
              на брейнбенче даже нет
              Ответить
            • Сначала найди промышленное использование haskell'а...

              Ну а типичный junior level, если мне не изменяет память, это умение решать небольшие четко сформулированные задачи. Т.е. если тебе, к примеру, поставят задачку - прочитать конфиг, распарсить его и представить в виде таких-то ADT, и ты за разумное время справишься с этим с помощью гугла, коллег и какой-то матери - ты полноценный хаскелист-джуниор :P
              Ответить
        • Строки есть в файле, кол-во строков известно. способ то есть, но какой?
          Ответить
    • Смотрю на код и не понимаю что тут такого страшного-то
      Ответить

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