Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.01 c