Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];

Вниз

Качество кода 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.005 c
15-1228945390
Германн
2008-12-11 00:43
2009.02.08
Печать pdf


2-1229759537
kyn66
2008-12-20 10:52
2009.02.08
Записи Foxpro помеченные на удаление


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


15-1229321392
Slider007
2008-12-15 09:09
2009.02.08
С днем рождения ! 13 декабря 2008 суббота


15-1228931271
Noone
2008-12-10 20:47
2009.02.08
DELPHi На ubuntu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский