Форум: "Основная";
Текущий архив: 2003.11.20;
Скачать: [xml.tar.bz2];
ВнизМассив Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c