Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-65856
RoLeX
2003-11-09 18:15
2003.11.20
Как сделать невидимым консольное приложение ??


6-66051
Анатолий
2003-09-25 11:52
2003.11.20
Sniffer


1-65864
Chlavik
2003-11-07 19:25
2003.11.20
TStatusBar и OwnerDraw какойто страшный глюк :)


1-65947
staryx
2003-11-11 12:32
2003.11.20
Отслеживание мыши.


1-65977
Eagle Owl
2003-11-10 18:53
2003.11.20
Вывод текста (TGraphicControl)





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