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

    −13

    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
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    {Автор Зорков Игорь - [email protected]}
    
    procedure TForm1.RefreshInfo;
    var
      i, ProcessCount: Integer;
      Processes: TProcesses;
      CPU, CPUIdle: Extended;
    begin
      TickCountOld:= GetTickCount - TickCount;
      TickCount:= GetTickCount;
      ProcessCount:= GetProcesses(Processes);
      NewPIDList.Clear;
      for i:= 0 to ProcessCount - 1 do
        NewPIDList.Add(IntToStr(Processes[i].PID));
      if (NewPIDList.Text <> PIDList.Text) then
      begin
        if NewPIDList.Count > 0 then
        begin
          for i:= 0 to NewPIDList.Count - 1 do
          begin
            if PIDList.IndexOf(NewPIDList.Strings[i]) = -1 then
            begin
              SetLength(ProcessInfo, Length(ProcessInfo) + 1);
              ProcessInfo[ProcessInfoList.Count]:= TProcessInfo.Create;
              ProcessInfo[ProcessInfoList.Count].Process:= Processes[i].Process;
              ProcessInfo[ProcessInfoList.Count].PID:= Processes[i].PID;
              CPU:= Int64(Processes[i].KernelTime.dwLowDateTime or (Processes[i].KernelTime.dwHighDateTime shr 32)) + Int64(Processes[i].UserTime.dwLowDateTime or (Processes[i].UserTime.dwHighDateTime shr 32));
              ProcessInfo[ProcessInfoList.Count].CPU:= CPU;
              ProcessInfo[ProcessInfoList.Count].CPUDelta:= CPU;
              if bRefreshFirstTime then
                ProcessInfo[ProcessInfoList.Count].New:= 2
              else
                ProcessInfo[ProcessInfoList.Count].New:= 0;
              ProcessInfo[ProcessInfoList.Count].Terminated:= 20;
              ProcessInfoList.AddObject(NewPIDList.Strings[i], ProcessInfo[ProcessInfoList.Count]);
            end;
          end;
        end;
    
        if PIDList.Count > 0 then
        begin
          for i:= 0 to PIDList.Count - 1 do
          begin
            if NewPIDList.IndexOf(PIDList.Strings[i]) = -1 then
            begin
              if ProcessInfoList.IndexOf(PIDList.Strings[i]) <> -1 then
              begin
                if (ProcessInfoList.Objects[ProcessInfoList.IndexOf(PIDList.Strings[i])] as TProcessInfo).Terminated = 20 then
                  (ProcessInfoList.Objects[ProcessInfoList.IndexOf(PIDList.Strings[i])] as TProcessInfo).Terminated:= 0;
              end;
            end;
          end;
        end;
    
        PIDList.Assign(NewPIDList);
      end;
    
      CPUIdle:= 0;
      for i:= 0 to ProcessCount - 1 do
      begin
        CPU:= Int64(Processes[i].KernelTime.dwLowDateTime or (Processes[i].KernelTime.dwHighDateTime)) + Int64(Processes[i].UserTime.dwLowDateTime or (Processes[i].UserTime.dwHighDateTime));
        (ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPUDelta:= CPU - (ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPU;
        (ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPU:= CPU;
        if Processes[i].PID <> 0 then
          CPUIdle:= CPUIdle + (ProcessInfoList.Objects[ProcessInfoList.IndexOf(IntToStr(Processes[i].PID))] as TProcessInfo).CPUDelta;
      end;
      if CPUIdle > 0 then
        (ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= CPUIdle
      else
        (ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= 100;

    Зачем юзать переменные? Это, блять, грех. Бог покарает. Обратите внимание, как этот долбоёб приводит типы, и сколько раз обращается к объекту по его индексу.

    Автор, возьми меч из папье-маше и отсеки себе руки по локоть. По локоть, блядь!..

    Запостил: rotretS, 16 Февраля 2017

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

    • Отправил ему письмо "ты долбоёб" с ссылкой на говнокод
      Ответить
    • if CPUIdle > 0 then
      (ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= CPUIdle
      else
      (ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= 100;

      Нам нужно больше тернарноговна
      Ответить
      • (ProcessInfoList.Objects[ProcessInfoList.IndexOf('0')] as TProcessInfo).CPUDelta:= ifthen(CPUIdle > 0, CPUIdle, 100);
        Ответить
        • @ifthen
          Это, наверно, в новых версиях появилось... Во всяком случае, я не знал о такой штуке.
          Ответить
          • Я тоже не слышал. Но оно же пишется элементарно:
            function ifthen(cond: Boolean; value1, value2: Integer): Integer;
              begin
                if cond then Result := value1 else Result := value2
              end;


            Правда, придётся описывать для каждого типа...

            Попытался определить, в какой версии появилась «из коробки». Нашёл аж в двух модулях, начиная с XE2:
            http://docwiki.embarcadero.com/Libraries/XE2/en/System.Math.IfThen
            http://docwiki.embarcadero.com/Libraries/XE2/en/System.StrUtils.IfThen

            В более ранних что-то не обнаруживается.
            Ответить
            • Парни из Эмбаркадеро очень сильно испортили язык. В новых делфях реально стало затруднительно кодить. По размеру, прожорливости, глючности и обилию свистелок они сравнялись с приблудами вроде VS; в самом языке увеличилось число подводных камней. Помнится мне, что метод Synchronize в Delphi7..2010 не умеет в замыкания (тупо не компилируется, выдаёт ошибку "cannot capture symbol <symbolname>"), и тут вдруг - на тебе: появляются анонимные функци, на которые можно брать указатели, анонимные же потоки.. Неслыханно. Нет уж, в этот ад я не полезу...
              Для меня время остановилось на Win 7 (без первис пака) и Delphi 7 (иногда - 2009, если требуется поддержка юникода). А дальше - конец света
              Ответить
            • в 2007 точно есть и в 7 вроде тоже. просто в модуле Math.
              Ответить
              • В 2010 есть и в Math, и в StrUtils (соответственно для скалярных и для строковых типов):
                http://docwiki.embarcadero.com/VCL/2010/en/Math.IfThen
                http://docwiki.embarcadero.com/VCL/2010/en/StrUtils.IfThen
                Ответить
                • RSS сломалась: мой комментарий в стоке не отображается. Нужно починить.

                  P.S. Починил, проверьте.
                  Ответить
              • Проверил.

                В Delphi 6 точно есть (и в Math, и в StrUtils), причём определено так же, как я процитировал ниже.

                В Delphi 5 отсутствует (в пятых Дельфях даже модуля StrUtils нет).
                Ответить
            • Ну нет же. Оба аргумента вычислятся, убивая всю суть конструкции.
              Ответить
              • встроенная работает также. И предназначена она не для обфускации ифов, а для примеров типа того что в коде, когда вычисление обоих ветвей ничему не мешает.
                Ответить
              • Оказывается, встроенная — не совсем встроенная. Ну то есть для неё нет хака в языке (в SYSTEM.TPS или в компиляторе, как для Writeln, например), она описана в модуле как обычная пользовательская.

                Math.pas из Delphi 8:

                interface
                
                function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer = 0): Integer; overload;
                function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64 = 0): Int64; overload;
                function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double = 0.0): Double; overload;
                
                implementation
                
                function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer): Integer;
                begin
                  if AValue then
                    Result := ATrue
                  else
                    Result := AFalse;
                end;
                
                function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64): Int64;
                begin
                  if AValue then
                    Result := ATrue
                  else
                    Result := AFalse;
                end;
                
                function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double): Double;
                begin
                  if AValue then
                    Result := ATrue
                  else
                    Result := AFalse;
                end;


                StrUtils.pas из Delphi 8:
                interface
                
                function IfThen(AValue: Boolean; const ATrue: string;
                  AFalse: string = ''): string; overload;
                
                implementation
                
                function IfThen(AValue: Boolean; const ATrue: string;
                  AFalse: string = ''): string;
                begin
                  if AValue then
                    Result := ATrue
                  else
                    Result := AFalse;
                end;


                Единственный «хак» — это слово «overload», которого в старых дельфях не было.
                Ответить
                • > это слово «overload», которого в старых дельфях не было
                  гонишь небось. Скажи еще что reintroduce в турбопаскале не было.
                  Ответить
                  • Ответить
                    • Была такая шутка у нас. Гораздо круче писать от guest'а, не имеющего возможности редактировать. При наличии гонки (когда несколько человек пишут комментарии в один говнокод) угадать номер следующего комментария труднее.
                      Ответить
                      • А ну, попытаемся зациклить...
                        http://govnokod.ru/22346#comment371705
                        Ответить
                        • wat?
                          Ответить
                          • Под вечер голова работает хуже, чем днём, а утром - гораздо хуже, чем вечером, ибо кофе, чтение сорцов, поздний сон.

                            Смог только 2 комма зациклить. Почти.
                            Можно набросать прогу для этого, смеха ради, только видишь ли, я давно уже не пишу только ради прикола.
                            Ответить
    • http://www.delphisources.ru/forum/showthread.php?t=20209
      Нужно перевести исходники dll "С" на "Delphi".
      Ответить

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