Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-45271
Termik
2002-10-04 11:50
2002.10.14
Хинты в меню


1-45364
Эльф
2002-10-06 12:02
2002.10.14
Менюшки в стиле OfficeXP


4-45635
dera
2002-08-07 16:06
2002.10.14
Функция, тут одна....


3-45207
wed
2002-09-23 12:11
2002.10.14
Как уместить в одном запросе ?


1-45250
NorthMan
2002-10-04 11:00
2002.10.14
Могу я использовать QReport, не создавая таблицу БД? Мне





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский