Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.08;
Скачать: CL | DM;

Вниз

Качество кода VCL   Найти похожие ветки 

 
atruhin ©   (2008-12-10 15:51) [0]

Понадобился класс, поддержки динамического массива (вставка сортировка и т.д.)
В итоге нашел в стандартной поставке Delphi 2007 модуль Mxarrays, обрадовался.
Создаю экземпляр массива, получаю исключение. Начинаю смотреть, в модуле
используются переменные менеджера памяти, которые помеченны в System
как Unsupported.
 AllocMemCount: Integer deprecated; {Unsupported}
 AllocMemSize: Integer deprecated; {Unsupported}
Ладно, убираю их использование, валится следующая ошибка, не зависящая от первой.
Вот тут и возник вопрос:
я понимаю ошибки возникающие, при каких то редких условиях, но когда ПОЛНОСТЬЮ
не рабочий модуль... Неужели перед поставкой трудно провести обычное авто-тестирование
тем же DUnit? А потом обсуждают почему Delphi популярность теряет.
PS. Понимаю что тема холиварная, но полдня править/тестировать, дебильные ошибки,
в стандартном модуле, наболело.


 
Rouse_ ©   (2008-12-10 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 ©   (2008-12-10 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 ©   (2008-12-10 17:14) [3]

> [0] atruhin ©   (10.12.08 15:51)
> но полдня править/тестировать, дебильные ошибки,
> в стандартном модуле, наболело.

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


 
jack128_   (2008-12-10 17:17) [4]


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


Ужастиков посмотреть захотелось?? :-D


 
Rouse_ ©   (2008-12-10 17:25) [5]


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

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


 
Riply ©   (2008-12-10 17:32) [6]

> [4] jack128_   (10.12.08 17:17)
> Ужастиков посмотреть захотелось?? :-D

Да уж. Спросила, не подумав о последствиях. Вопрос снимается :)


 
atruhin ©   (2008-12-10 17:52) [7]

> [3] Riply ©   (10.12.08 17:14)

Например проблемма с Anchors в MDI формах, танется через много версий,
или выполни код из [2], и докажи что это нормально поведение.


 
Илья Корстин ©   (2008-12-10 17:58) [8]


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

Какая проблема?


 
Rouse_ ©   (2008-12-10 17:59) [9]


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

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

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

Эта ошибка уже непомню сколько лет тянется, описана на кодецентрале и все еще не пофиксена... Ну и много чего еще, вспоминать лениво...


 
Rouse_ ©   (2008-12-10 18:02) [10]


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

Это абсолютно нормальное поведение, причем которое абсолютно спокойно читается по исходному коду. Я не нашел там каких либо неожиданностей.
Если хочешь работать непосредственно с TStringArray и иметь то поведение которое тебе надобно, так и используй его напрямую, зачем долбиться к его методам через промежуточную обертку?


 
atruhin ©   (2008-12-10 18:03) [11]

> [8] Илья Корстин ©   (10.12.08 17:58)

Лень расписывать, набери в google : delphi Anchors MDI
будет куча ссылок с описанием и попытками обхода.


 
atruhin ©   (2008-12-10 18:05) [12]

> [10] Rouse_ ©   (10.12.08 18:02)
> Это абсолютно нормальное поведение,

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


 
Rouse_ ©   (2008-12-10 18:15) [13]


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

Еще раз повторяю - в исходниках все это хорошо читается.
То что нет документации в которой описывалось такое поведение - это плохо, с другой стороны, есть множество функций в которых поведение с одним параметром отличатся от поведения с абсолютно другим параметром, например NtQuerySystemInformation с флагом SystemProcessesAndThreadsInformation вернет размер требуемого буффера, в отличие от флага SystemHandleInformation - где эта функция будет выдавать ошибку до тех пор, пока ты не передаш ей буффер желаемого размера...



Страницы: 1 вся ветка

Текущий архив: 2009.02.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
3-1214894986
zorik
2008-07-01 10:49
2009.02.08
Можна удалить записи только запросом, без хранимки?


15-1229072276
Antonsh
2008-12-12 11:57
2009.02.08
Как задать версию приложения


2-1229952777
greg123
2008-12-22 16:32
2009.02.08
Отображение числовых данных по определенному формату в EhGrid-e


8-1190441010
andreil
2007-09-22 10:03
2009.02.08
Помогите с DirectInput!


3-1214511490
Duma
2008-06-27 00:18
2009.02.08
Как перегнать записи из Table1