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

Вниз

Array   Найти похожие ветки 

 
Le Taon   (2002-10-03 12:31) [40]

Mike Kouzmine
Твой подход может годиться только для
пользовательского кода самого верхнего уровня разового применения, набитого на живую нитку в режиме цейтнота.
(один мой знакомый называет его "живопырка").

Код ядра никогда так никогда не писался и писаться не будет,
вне зависимости от частоты процессора и объёмов памяти.


 
Smithson ©   (2002-10-03 12:37) [41]

Ну вы нагородили....


 
Serg Gurin   (2002-10-06 03:47) [42]

Ответ на заданный вначале вопрос перерос в большую полемику :). Тут я так понимаю столкнулись две ветви программирования, грубо говоря - Basic и Си. Одни говорят пусть тормозит - зато надежно, другие - я пишу круто и без ошибок, поэтому нужно писать что б работало побыстрее. Как мне кажется и те и другие правы на 100%. Лично я исхожу (думаю как и многие из Вас) из посталенной задачи. Если скорость не требуется и железо позволяет - можно писать

for I:=1 to N do
begin
SetLength(DataArray, I);
DataArray[I-1] := Data;
end;

и затем так же обрабатывать

Sum := 0;
for I:=0 to Length(DataArray)-1 do
Sum := Sum + DataArray[I];

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

определить типы

type
PLongArray = ^TLongArray;
TLongArray = array [0..(MaxInt div SizeOf(LongInt))-1] of LongInt;
или если хотите
TLongArray = array [0..0] of LongInt;
но тогда в нужном месте (перед обращенем через индекс) нужно поставить {$R-} - отключить проверку на выход за границы массива, если таковой включен (на время отладки :))

var
Count: LongInt;
AllocCount: LongInt;
DataArray: PLongArray;

в нужном месте программы вставить если неясно сколько данных прийдет

ElementSize := SizeOf(LongInt);
AllocCount := 0;
Count := 0;
DataArray := nil;
while Count < N do
begin
if Count >= AllocCount then
begin
AllocCount := AllocCount + 1000;
ReAllocMem(DataArray, AllocCount*ElementSize);
end;
DataArray^[Count] := Data;
Inc(Count);
end;
if AllocCount > Count then
ReAllocMem(DataArray, Count*ElementSize);

или известно их максимальное количество

ElementSize := SizeOf(LongInt);
Count := 0;
DataArray := AllocMem(MaxAllocCount*ElementSize);
while Count < N do
begin
if Count >= MaxAllocCount then
begin
MessageBox(Application.Handle, "Данных пришло все-таки больше :)", "Ошибка!", MB_ICONERROR + MB_OK + MB_SYSTEMMODAL);
Break;
end;
DataArray^[Count] := Data;
Inc(Count);
end;
if MaxAllocCount > Count then
ReAllocMem(DataArray, Count*ElementSize);

и затем пользоваться

Sum := 0;
I:=0;

while I < Count do
begin
Sum := Sum + DataArray^[I];
Inc(I);
end;

в конце не забыть освободить массив
FreeMem(DataArray, Count * ElementSize);
DataArray := nil;

не претендую что откомпилируется без ошибок - я ж все-таки не компилятор :), но работать должно, причем надежно в обоих случаях.

Заводить отдельный класс мне кажется не нужно - так как будет тормозить и весьма сильно, а если скорости не требуется, то сойдет и SetLength - коротко и надежно.

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



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

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

Наверх




Память: 0.55 MB
Время: 0.019 c
1-45404
dimonf
2002-10-03 10:36
2002.10.14
Подскажите плиз, как распахнуть MDI окно при FormActivate?


1-45410
dagsess
2002-10-03 12:02
2002.10.14
Поиск в памяти процесса


14-45512
BigBadMutuh
2002-09-17 16:38
2002.10.14
Вопросы по биологии.


1-45331
Avsam
2002-10-04 14:25
2002.10.14
Вертикальный TLabel


3-45213
Макз
2002-09-23 13:02
2002.10.14
Field description