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

Вниз

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

 
dead1   (2003-11-11 15:11) [0]

Маленький вопросец.
Есть массив buf : array[0..1000000] of longint;
и кол-во реально занятых елементов buf_size : longint;

x := 0;
repeat
if (buf_new[x] = variants[y,0]) and (buf_new[x+1] = variants[y,1]) and (buf_new[x+2] = variants[y,2]) and (buf_new[x+3] = variants[y,3]) then
begin
for a := x+4 to buf_new_size-1 do
buf_new[a-3] := buf_new[a];
Dec(buf_new_size,3);
buf_new[x] := 256 + y;
end;
Inc(x);
until x > buf_new_size-4;


могу ли я поменять это
for a := x+4 to buf_new_size-1 do
buf_new[a-3] := buf_new[a];

на это
Move(buf_new[x+4],buf_new[x+1],buf_new_size-(x+4));
чтобы произвести тоже самое, но быстрее или надо как-нибудь подругому?
пс: использую free pascal, так что часть функций дельфей не будет работать


 
dead1   (2003-11-11 15:19) [1]

чтобы было немного понятнее, я пробегаю весь массив от 0 до buf_size-4, сравниваю 4 элемента подряд, первый меняю на определённое значение, а потом весь массив двигаю на 3 элемента назад.


 
Reindeer Moss Eater ©   (2003-11-11 15:24) [2]

если массив никогда не бывает разряженным, то встречный вопрос:
а зачем массив вообще?


 
dead1   (2003-11-11 15:27) [3]

Это, простите, каким? (что означает разряженный массив?)


 
Reindeer Moss Eater ©   (2003-11-11 15:29) [4]

В котором есть пустые элементы


 
dead1   (2003-11-11 15:34) [5]

ммм... в общем-то, мне нужена только часть массива от 0 до buf_size. Остальные элементы, которые там остаются мне до лампочки. Я заметил то, что цикл и move немножко по-другому двигают массив. Первая ошибка возникла где-то посередине (~400.000-й байт).... однако, тяжко проверить, кто правильнее работает.


 
Reindeer Moss Eater ©   (2003-11-11 15:41) [6]

А нельзя ли обойтись списком, и забыть про упаковку массива?


 
PVitaliy   (2003-11-11 15:44) [7]

Кажется вот так должно работать:

MoveMemory(@buf_new[x+4],@buf_new[x+1],(buf_new_size-(x+4))*sizeof(longint));

MoveMemory -- апишная функция.


 
dead1   (2003-11-11 15:49) [8]

PVitaliy
Ах, ну да, надо ж ещё на 2 домножать.

Reindeer Moss Eater
Я так и собираюсь сделать, но потом, если всё начнёт пахать. А пока нужно всё по-простому.

Cпасибо.


 
Reindeer Moss Eater ©   (2003-11-11 15:54) [9]

Так по простому - это и есть с помошью списка.
Тебе же неважен индекс элемента массива как я понял.
Нужно что бы был последовательный доступ к элементам, между которыми нет промежутков.


 
dead1   (2003-11-11 15:59) [10]

Не люблю я с указателями возиться :( Всегда их напоследок оставляю.


 
Reindeer Moss Eater ©   (2003-11-11 16:13) [11]

MyList:=TList.Create;

with MyList do
begin
Add(TObject(1));
Add(TObject(2));
Add(TObject(3));
Add(TObject(7777777));
end;

MyInt:=Integer(MyList[0]);
MyList.Delete(1);
MyAnotherInt:=Integer(MyList[1]);
....

И ни одной "крышки" как видишь


 
Reindeer Moss Eater ©   (2003-11-11 16:16) [12]

Ну и кроме всего прочего еще и экономия памяти по сравнению
с buf : array[0..1000000] of longint;


 
dead1   (2003-11-11 16:17) [13]

procedure CopyMemory(pDst : pointer; p Src : pointer; ByteLen : longint); external "kernel32.dll" name "RtlMoveMemory";

CopyMemory(@buf_new[x+1],@buf_new[x+4], buf_new_size-(x+4));

Работает чуток быстрее, чем паскалевский Move.
Оказалось, что в то цикле я какую-то фигню написал.


 
PVitaliy   (2003-11-11 16:44) [14]

В справке по винапи написанно что CopyMemory использовать не рекомендуется когда блоки памяти пересекаются (в твоем случае), а использовать MoveMemory.


 
dead1   (2003-11-11 16:58) [15]

Странно. На самом деле - это RtlMemoryMove. Просто обозвали её так. Всё-таки я нешёл MoveMemory в фри паскале, но это тоже самое, что и обычный Move(Dst,Src,Len). В сборнике апи функций "AllAPI" есть только такая функция.
Ну, пока всё работает и то хорошо.


 
dead1   (2003-11-11 17:09) [16]

to Reindeer Moss Eater
Гм... век живи - век учись. Надо будет поиграться с такой штукой.



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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
1-65947
staryx
2003-11-11 12:32
2003.11.20
Отслеживание мыши.


1-65939
anbezr
2003-11-11 11:06
2003.11.20
ресурсы ехе - много лишнего.


1-65929
Chuha
2003-11-11 15:09
2003.11.20
Окна


14-66065
NailMan
2003-10-30 12:22
2003.11.20
Посоветуйте хостинг, бесплатный, без излишеств


3-65737
IGORYOK
2003-10-30 19:17
2003.11.20
Как удобней хранить и в чём