-
Понадобился класс, поддержки динамического массива (вставка сортировка и т.д.) В итоге нашел в стандартной поставке Delphi 2007 модуль Mxarrays, обрадовался. Создаю экземпляр массива, получаю исключение. Начинаю смотреть, в модуле используются переменные менеджера памяти, которые помеченны в System как Unsupported. AllocMemCount: Integer deprecated; {Unsupported} AllocMemSize: Integer deprecated; {Unsupported} Ладно, убираю их использование, валится следующая ошибка, не зависящая от первой. Вот тут и возник вопрос: я понимаю ошибки возникающие, при каких то редких условиях, но когда ПОЛНОСТЬЮ не рабочий модуль... Неужели перед поставкой трудно провести обычное авто-тестирование тем же DUnit? А потом обсуждают почему Delphi популярность теряет. PS. Понимаю что тема холиварная, но полдня править/тестировать, дебильные ошибки, в стандартном модуле, наболело.
-
> Понимаю что тема холиварная, но полдня править/тестировать, > дебильные ошибки, > в стандартном модуле, наболело.
Не нужно искать ошибки там где их нет, нужно учиться программировать: program Project2;
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.
-
Нда уж, признаю, лопухнулся. В хелпе как обычно, ни строчки, а сам не понял сакрально смысла. Тогда может вот это поведение объяснишь:
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
-
> [0] atruhin © (10.12.08 15:51) > но полдня править/тестировать, дебильные ошибки, > в стандартном модуле, наболело.
А можно список "стандартных модулей и дебильных ошибкок", которые ты в них исправил ?
-
> А можно список "стандартных модулей и дебильных ошибкок", > > которые ты в них исправил ?
Ужастиков посмотреть захотелось?? :-D
-
> Тогда может вот это поведение объяснишь:
Легко, достаточно посмотреть исходник. В TCustomArray.SetItem обработчик varInteger выглядит как TIntArray(FArray)[Index] := Value; а обработчик varString TStringArray(FArray).Insert(Index, Value); Отсюда и увеличение размера.
-
> [4] jack128_ (10.12.08 17:17) > Ужастиков посмотреть захотелось?? :-D
Да уж. Спросила, не подумав о последствиях. Вопрос снимается :)
-
> [3] Riply © (10.12.08 17:14)
Например проблемма с Anchors в MDI формах, танется через много версий, или выполни код из [2], и докажи что это нормально поведение.
-
> Например проблемма с Anchors в MDI формах
Какая проблема?
-
> А можно список "стандартных модулей и дебильных ошибкок", > которые ты в них исправил ?
В действительности таких предостаточно и иногда к сожалению приходится править "генофонд", например мне пришлось переписать большинство элементов из ComCtrls (HeaderControl, SysTreeView32, SysListView32 etc) для того чтобы они хотябы поддерживали нормально тот функционал который за ними закреплен в MSDN, ибо меня не устраивает куцость текущей их VCL реализации, а из явно ошибочных также предостаточно. Например пресловутый TCustomComboBoxEx от которого нельзя сделать по нормальному наследника с расширением функциональности итемов. У них эта функциональность заложена, есть метод function GetItemsClass: TCustomComboBoxStringsClass; override;
но толку от него, если в конструкторе написано: Items := TComboBoxExStrings.Create(Self);
Эта ошибка уже непомню сколько лет тянется, описана на кодецентрале и все еще не пофиксена... Ну и много чего еще, вспоминать лениво...
-
> или выполни код из [2], и докажи что это нормально поведение.
Это абсолютно нормальное поведение, причем которое абсолютно спокойно читается по исходному коду. Я не нашел там каких либо неожиданностей. Если хочешь работать непосредственно с TStringArray и иметь то поведение которое тебе надобно, так и используй его напрямую, зачем долбиться к его методам через промежуточную обертку?
-
> [8] Илья Корстин © (10.12.08 17:58)
Лень расписывать, набери в google : delphi Anchors MDI будет куча ссылок с описанием и попытками обхода.
-
> [10] Rouse_ © (10.12.08 18:02) > Это абсолютно нормальное поведение,
Как это нормальное? если вызов одного и того же метода приводит к разным результатам, в зависимости от хранимых данных?
-
> Как это нормальное? если вызов одного и того же метода приводит > к разным результатам, > в зависимости от хранимых данных?
Еще раз повторяю - в исходниках все это хорошо читается. То что нет документации в которой описывалось такое поведение - это плохо, с другой стороны, есть множество функций в которых поведение с одним параметром отличатся от поведения с абсолютно другим параметром, например NtQuerySystemInformation с флагом SystemProcessesAndThreadsInformation вернет размер требуемого буффера, в отличие от флага SystemHandleInformation - где эта функция будет выдавать ошибку до тех пор, пока ты не передаш ей буффер желаемого размера...
|