Конференция "Прочее" » Качество кода VCL
 
  • atruhin © (10.12.08 15:51) [0]
    Понадобился класс, поддержки динамического массива (вставка сортировка и т.д.)
    В итоге нашел в стандартной поставке Delphi 2007 модуль Mxarrays, обрадовался.
    Создаю экземпляр массива, получаю исключение. Начинаю смотреть, в модуле
    используются переменные менеджера памяти, которые помеченны в System
    как Unsupported.
     AllocMemCount: Integer deprecated; {Unsupported}
     AllocMemSize: Integer deprecated; {Unsupported}
    Ладно, убираю их использование, валится следующая ошибка, не зависящая от первой.
    Вот тут и возник вопрос:
    я понимаю ошибки возникающие, при каких то редких условиях, но когда ПОЛНОСТЬЮ
    не рабочий модуль... Неужели перед поставкой трудно провести обычное авто-тестирование
    тем же DUnit? А потом обсуждают почему Delphi популярность теряет.
    PS. Понимаю что тема холиварная, но полдня править/тестировать, дебильные ошибки,
    в стандартном модуле, наболело.
  • Rouse_ © (10.12.08 16:23) [1]

    > Понимаю что тема холиварная, но полдня править/тестировать,
    >  дебильные ошибки,
    > в стандартном модуле, наболело.

    Не нужно искать ошибки там где их нет, нужно учиться программировать:

    program Project2;

    {$APPTYPE CONSOLE}

    uses
     SysUtils,
     Mxarrays in 'Mxarrays.pas';

    function CompareProc(var item1, item2: Integer): Integer;
    begin
     if item1 > item2 then
       Result := 1
     else
       if item1 >= item2 then
         Result := 0
       else
         Result := -1;    
    end;

    var
     A: TIntArray;
     I: Integer;
    begin
     try
       Randomize;
       SetMemoryCapacity(20 * SizeOf(Integer));
       A := TIntArray.Create(0, SizeOf(Integer));
       try
         A.CompareProc := @CompareProc;
         A.SortOrder := tsAscending;
         // Заполнение массива данными
         for I := 0 to 9 do
           A.Add(Random(MaxInt));

         // Вывод содержимого массива на экран
         Writeln('Start Array:');
         for I := 0 to A.Count - 1 do
           Writeln(I, ': ', A[I]);

         // Удаление из массива нечетных элементов
         for I := 9 downto 0 do
           if A[I] mod 2 = 1 then
             A.Delete(I);

         Writeln;
         Writeln('Array after delete:');
         // Вывод содержимого массива на экран
         for I := 0 to A.Count - 1 do
           Writeln(I, ': ', A[I]);

         // Добавление в конец массива сумм пар элементов
         A.SortOrder := tsNone;
         for I := 0 to A.Count - 2 do
           A.Add(A[I] + A[I + 1]);

         Writeln;
         Writeln('Array with summ:');
         // Вывод содержимого массива на экран
         for I := 0 to A.Count - 1 do
           Writeln(I, ': ', A[I]);
           
         Readln;
       finally
         A.Free;
       end;
     except
       on E:Exception do
         Writeln(E.Classname, ': ', E.Message);
     end;
    end.

  • atruhin © (10.12.08 17:10) [2]
    Нда уж, признаю, лопухнулся. В хелпе как обычно, ни строчки, а сам не понял сакрально смысла.
    Тогда может вот это поведение объяснишь:

    program Project111;

    {$APPTYPE CONSOLE}

    uses
     SysUtils,
     Mxarrays in 'C:\Users\A.Truhin\Documents\RAD Studio\Projects\Mxarrays.pas';

    var
     IA : TCustomArray;
    begin
     try
     SetMemoryCapacity(400 * SizeOf(Integer));
     IA := TCustomArray.Create(0, varInteger);
     IA.Add(10);
     IA.Add(20);
     IA.Items[1] := 30;
     Writeln(IA.MemberCount);
     IA.Free;
     IA := TCustomArray.Create(0, varString);
     IA.Add('10');
     IA.Add('20');
     IA.Items[1] := '30';
     Writeln(IA.MemberCount);
     IA.Free;
     Readln;
     except
       on E:Exception do
         Writeln(E.Classname, ': ', E.Message);
     end;
    end.
    Выводит 2-3
  • Riply © (10.12.08 17:14) [3]
    > [0] atruhin ©   (10.12.08 15:51)
    > но полдня править/тестировать, дебильные ошибки,
    > в стандартном модуле, наболело.

    А можно список "стандартных модулей и дебильных ошибкок",
    которые ты в них исправил ?
  • jack128_ (10.12.08 17:17) [4]

    > А можно список "стандартных модулей и дебильных ошибкок",
    >
    > которые ты в них исправил ?


    Ужастиков посмотреть захотелось?? :-D
  • Rouse_ © (10.12.08 17:25) [5]

    > Тогда может вот это поведение объяснишь:

    Легко, достаточно посмотреть исходник.
    В TCustomArray.SetItem обработчик varInteger выглядит как
    TIntArray(FArray)[Index] := Value;


    а обработчик varString
    TStringArray(FArray).Insert(Index, Value);


    Отсюда и увеличение размера.
  • Riply © (10.12.08 17:32) [6]
    > [4] jack128_   (10.12.08 17:17)
    > Ужастиков посмотреть захотелось?? :-D

    Да уж. Спросила, не подумав о последствиях. Вопрос снимается :)
  • atruhin © (10.12.08 17:52) [7]
    > [3] Riply ©   (10.12.08 17:14)

    Например проблемма с Anchors в MDI формах, танется через много версий,
    или выполни код из [2], и докажи что это нормально поведение.
  • Илья Корстин © (10.12.08 17:58) [8]

    > Например проблемма с Anchors в MDI формах

    Какая проблема?
  • Rouse_ © (10.12.08 17:59) [9]

    > А можно список "стандартных модулей и дебильных ошибкок",
    > которые ты в них исправил ?

    В действительности таких предостаточно и иногда к сожалению приходится править "генофонд", например мне пришлось переписать большинство элементов из ComCtrls (HeaderControl, SysTreeView32, SysListView32 etc) для того чтобы они хотябы поддерживали нормально тот функционал который за ними закреплен в MSDN, ибо меня не устраивает куцость текущей их VCL реализации, а из явно ошибочных также предостаточно.
    Например пресловутый TCustomComboBoxEx от которого нельзя сделать по нормальному наследника с расширением функциональности итемов. У них эта функциональность заложена, есть метод
    function GetItemsClass: TCustomComboBoxStringsClass; override;

    но толку от него, если в конструкторе написано:
    Items := TComboBoxExStrings.Create(Self);

    Эта ошибка уже непомню сколько лет тянется, описана на кодецентрале и все еще не пофиксена... Ну и много чего еще, вспоминать лениво...
  • Rouse_ © (10.12.08 18:02) [10]

    > или выполни код из [2], и докажи что это нормально поведение.

    Это абсолютно нормальное поведение, причем которое абсолютно спокойно читается по исходному коду. Я не нашел там каких либо неожиданностей.
    Если хочешь работать непосредственно с TStringArray и иметь то поведение которое тебе надобно, так и используй его напрямую, зачем долбиться к его методам через промежуточную обертку?
  • atruhin © (10.12.08 18:03) [11]
    > [8] Илья Корстин ©   (10.12.08 17:58)

    Лень расписывать, набери в google : delphi Anchors MDI
    будет куча ссылок с описанием и попытками обхода.
  • atruhin © (10.12.08 18:05) [12]
    > [10] Rouse_ ©   (10.12.08 18:02)
    > Это абсолютно нормальное поведение,

    Как это нормальное? если вызов одного и того же метода приводит к разным результатам,
    в зависимости от хранимых данных?
  • Rouse_ © (10.12.08 18:15) [13]

    > Как это нормальное? если вызов одного и того же метода приводит
    > к разным результатам,
    > в зависимости от хранимых данных?

    Еще раз повторяю - в исходниках все это хорошо читается.
    То что нет документации в которой описывалось такое поведение - это плохо, с другой стороны, есть множество функций в которых поведение с одним параметром отличатся от поведения с абсолютно другим параметром, например NtQuerySystemInformation с флагом SystemProcessesAndThreadsInformation вернет размер требуемого буффера, в отличие от флага SystemHandleInformation - где эта функция будет выдавать ошибку до тех пор, пока ты не передаш ей буффер желаемого размера...
 
Конференция "Прочее" » Качество кода VCL
Есть новые Нет новых   [134447   +40][b:0][p:0.002]