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

    +86

    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
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    const n=10;
    
    type
         xfl = record x: double; fl: longint; end;
      ar_xfl = array[1..2*n] of xfl;
    var
      i: longint;
      x,y,r: double;
      a: ar_xfl;
      f: text;
    
    
    procedure qsort(var a: ar_xfl; lo,hi: longint);
        procedure sort(l,r: longint);
        var
          i,j,k: longint;
          tmp: xfl;
        begin
          i:=l;
          j:=r;
          k:=(l+r) div 2;
          repeat
            while a[i].x<a[k].x do inc(i);
            while a[k].x<a[j].x do dec(j);
            if i<=j then
              begin
                tmp:=a[i];
                a[i]:=a[j];
                a[j]:=tmp;
                inc(i);
                dec(j);
              end;
          until i>j;
          if l<j then sort(l,j);
          if i<r then sort(i,r);
        end;
    begin
    sort(lo,hi);
    end;

    За такие названия переменных надо руки завязывать узлом. Да и помимо этого..

    Запостил: Cynicrus, 05 Декабря 2014

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

    • По-моему квиксорт лучше с такими переменными выглядит, чем с LowerBound.
      А помимо этого что?
      Ответить
      • Особенно c xfl и ar_xfl.
        Ответить
        • Если это лаба (на что намекает const n = 10) - тоже нормально. Как еще назвать запись в которой по заданию есть булевое поле fl и вещественное x?
          Ответить
        • Привет, а можно задам вопрос,который давно меня мучает:

          Есть многопоточная прога. При создании потоков, инкрементируется значение переменной-счётчика, при деструкции - декрементируется. При закрытии формы, прога тормозит все потоки и ждёт, когда они завершатся, чтобы не было утечки, проверяя значение переменной - равно ли оно нулю. Если равно нулю - программа завершается. В каком месте в классе потока нужно уменьшать счётчик? Я запутался.

          destructor tmythread.destroy;
          begin
            {первым делом удаляемся из списка, а то,
            не дай боже, кто-то залочит лист и обратится к уже разрушенным полям потока}
            threadlist.remove(self);
            {освобождаем занятые ресурсы}
            if assigned(files) then
            files.free;
            Inherited destroy; // разрушаем созданный объект. Правильно ли писать какой-нибудь код ниже?
            interlockeddecrement(ThreadsCount);
          end;


          Также я пытался отказаться от счётчика и перед завершением программы в цикле проверять, сколько потоков осталось в листе - менеджер памяти молчит, значит, утечек нет. Но правильно ли так делать? Есть ли гарантии, что доп-потоки успеют разрушиться, до завершения главного потока?
          Ответить
          • threadlist.remove(self);
            дельфинопотокобезопасно ли это?
            Ответить
            • Да, каждый раз перед вызовом методов Add или Remove внутри листа запирается мьютекс.
              Ответить
              • побуду дельфинчиком
                It is perfectly safe to execute code after a call to an inherited destructor, so long as that code does not rely on something that has been destroyed by that inherited destructor. In the same way it is safe to execute code before a call to an inherited constructor, so long as the code does not rely on anything instantiated in that inherited constructor.
                если твоё ThreadsCount не поле твоего объекта, то работать с ним можно

                btw почитай про семафоры, наверняка они должны быть в дельфях, как и wait оного, а то
                > проверяя значение переменной - равно ли оно нулю
                спинлок вручную?
                Ответить
                • > семафоры
                  Семафорка не особо поможет, тут надо wait condition. Хотя, имхо, и текущая версия с busy wait сойдет - один фиг это уже завершение работы (и, скорее всего, у него в этом цикле стоит небольшой sleep, отдающий такты остальным тредам).
                  Ответить
                  • а какая тут разница между семафором и condition, да так, что семафор не поможет?
                    кроме того, что с кондишеном придется 3 сущности заводить (мютекс, кондишен, счетчик), а семафор сам по себе три в одном
                    Ответить
                    • А как воспользоваться семафором так, чтобы он пропустил главный тред только тогда, когда умрёт последний поток? Что-то я не могу придумать алгоритм.
                      Ответить
                      • Вот-вот, я тоже всю голову сломал. В модуле classes вообще такая содомия, что без 50 г не разберёшься. Кстати, я был шокирован тем, что BeginThread, которая используется чтобы создать поток - это не одноимённая API, а обёртка над CreateThread *facepalm*
                        Ответить
                        • Вот, кстати, ссылка на фрагмент из Classes
                          http://pastebin.com/E8CHyr9M
                          Там описан класс tthread
                          Ответить
                • Ага, вручную. Вообще, там есть метод, который называется WaitFor.
                  Там банальный вызов waitforsingleobject. Но было непонятно всё же, куда пихать декремент счётчика, ибо освобождение ресурсов происходит не при завершении потока (завершение-то легко определить), а при его деструкции.

                  Спасибо)
                  Ответить
          • > Есть ли гарантии, что доп-потоки успеют разрушиться, до завершения главного потока?
            Гарантий нету, часть тредов может не успеть позакрывать файлы, а главный уже увидит пустой список и завершит прогу.

            В текущей версии серьезных проблем не вижу.
            Ответить
          • Залогинься, стретор
            Ответить
      • чт т скзл, мдк?
        Ответить
    • Лабы не нужны.
      Ответить
      • я тож так думаю. Пусть люди сразу крузисы пишут
        Ответить
    • Это у вас в продакшене такое?

      У вас в продакшене сами написали свой квиксорт? А merge sort есть свой? А связанный список? А строка своя?
      Ответить

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