PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » копирование блоков памяти


копирование блоков памяти

Сообщений 1 страница 8 из 8

1

Как из одного банка памяти блок скопировать в другой банк памяти (без PEEK/POKE)?

На BlitzPlus это делается так:
CopyBank src_bank, src_offset, dest_bank, dest_offset, count

В HELP'е PureBasic упоминаются процедуры:

CopyMemory(*SourceMemoryID, *DestinationMemoryID, Length)
MoveMemory(*SourceMemoryID, *DestinationMemoryID, Length)

они копируют блок только в пределах одного банка памяти?

CopyMemory и MoveMemory отличаются только тем, что CopyMemory не контролирует overlap (источник внахлёст получателя), а MoveMemory перед копированием проверяет на overlap и если получатель внахлёст, то копирует начиная "с хвоста"?

0

2

4RESTER написал(а):

они копируют блок только в пределах одного банка памяти

Они копируют из одного выделеного участка памяти в другой в пределах текущего процесса

Код:
*mem1 = AllocateMemory(10)   ; Выделение 1-го участка памяти, равного 10 байт
*mem2 = AllocateMemory(10)   ; Выделение 2-го участка памяти, равного 10 байт
CopyMemory(*mem1, *mem2, 10) ; Копирование данных из *mem1 в *mem2

Или нужно работать с памятью чужого процесса?

0

3

Пётр написал(а):

Код:*mem1 = AllocateMemory(10)   ; Выделение 1-го участка памяти, равного 10 байт
*mem2 = AllocateMemory(10)   ; Выделение 2-го участка памяти, равного 10 байт
CopyMemory(*mem1, *mem2, 10) ; Копирование данных из *mem1 в *mem2Или нужно работать с памятью чужого процесса?

Нет, с банками памяти своей-же задачей и открытые.
Т.е. создаются, например, 2 банка :

*bnk_1 = AllocateMemory(1024)
*bnk_2 = AllocateMemory(2048)

как скопировать например блок:


В     банк с хэндлером bnk_1, смещение 0x100
ИЗ    банка с хэндлером bnk_2, смещение 0x200, длина 0x80

?

0

4

Код:
*bnk_1 = AllocateMemory(1024)
*bnk_2 = AllocateMemory(2048)
CopyMemory(*bnk_2+$200, *bnk_1+$100, $80)

0

5

Пётр написал(а):

Код:
*bnk_1 = AllocateMemory(1024)
*bnk_2 = AllocateMemory(2048)
CopyMemory(*bnk_2+$200, *bnk_1+$100, $80)

Понял, *XXX = это как-бы хэндлер со смещением 0x0, а синтаксис *XXX+offset это и есть указание хендлер и смещение.

Тогда такой вопрос, можно ли хранить такие хэндлеры как числовые значения, и в дальнейшем использовать их?

Например.
*bnk_1 = AllocateMemory(1024)
*bnk_2 = AllocateMemory(2048)
A = *bnk_1
B = *bnk_2
CopyMemory(*B+$200, *A+$100, $80)

так работает?

Отредактировано 4RESTER (19.08.2010 14:03:17)

0

6

4RESTER написал(а):

Понял, *XXX = это как-бы хєндлер со смещением 0x0

Это указатель на первую ячейку выделеной памяти - число, указывающее на физический адрес в оперативной памяти компа.

4RESTER написал(а):

Тогда такой вопрос, можно ли хранить такие хєнжлеры как числовые значения

Они как раз хранятся в виде чисел.

Вот для примера, побайтовая запись и чтение данных из памяти.

Код:
*mem=AllocateMemory(10)
For i=0 To 9
  PokeB(*mem+i , i) ; Запись байта в память
Next

For i=0 To 9
  Debug PeekB(*mem+i) ; Чтение байта из памяти
Next
FreeMemory(*mem)

PS.
Кое что по теме можно прочитать здесь
http://pure-basic.narod.ru/docs/memory.html
http://pure-basic.narod.ru/docs/point.html

0

7

Код:
*bnk_1 = AllocateMemory(1024)
*bnk_2 = AllocateMemory(2048)
CopyMemory(*bnk_2+$200, *bnk_1+$100, $80)
вроде всё понятно,
теперь вопрос по контролю overlap.

Код:
*bnk = AllocateMemory(1024)
CopyMemory(*bnk+$100, *bnk+$101, $80)
результатом будет корректное копирование 0x100...0x17F -> 0x0101...0x180,
или произойдёт overlap (скопированное смещением выше значение вновь и вновь будет дублироваться)?

Отредактировано 4RESTER (19.08.2010 14:40:12)

0

8

4RESTER написал(а):

CopyMemory(*bnk+$100, *bnk+$101, $80)

В этом случае, нужно использовать MoveMemory(*bnk+$100, *bnk+$101, $80)

В сравке написанно

Если исходный и конечный буферы прекрываются, то безопаснее использовать MoveMemory(), иначе возможен неправильный результат.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » копирование блоков памяти