Если мне нужно скопировать часть памяти заданного размера, есть ли для этого типичное слово Форта? Что-то вроде C's memcpy
или memmove
?
Что такое эквивалент memcpy в Forth?
Ответы (1)
Копирование памяти
Стандарт Forth определяет MOVE
в наборе слов Core для копирования произвольной памяти:
MOVE
( addr1 addr2 u -- )
Если u больше нуля, скопируйте содержимое u последовательных единиц адреса по адресу addr1 в u последовательных единиц адреса по адресу addr2. После завершенияMOVE
последовательные единицы адреса u по адресу addr2 содержат точно такое же количество последовательных единиц адреса u по адресу < em>addr1, который содержался перед перемещением.
Как и memmove
, MOVE
позволяет источнику и получателю перекрываться, как если бы копирование произошло с использованием промежуточного буфера.
Распространение строк
Стандарт Forth также определяет CMOVE
и CMOVE>
в наборе строковых слов:
CMOVE
( c-addr1 c-addr2 u -- )< br /> Если u больше нуля, скопируйте u последовательных символов из пространства данных, начиная с c-addr1 em> к адресу, начинающемуся с c-addr2, идущему посимвольно от младших адресов к старшим.
CMOVE>
( c-addr1 c-addr2 u -- )< br /> Если u больше нуля, скопируйте u последовательных символов из пространства данных, начиная с c-addr1 em> к адресу, начинающемуся с c-addr2, идущему посимвольно от более высоких адресов к более низким адресам.
CMOVE
и CMOVE>
копируют символы один за другим, по порядку, начиная с начала и конца строки соответственно.
MOVE
уже способен безопасно копировать строки (используя CHARS
для полного соответствия стандарту). Но CMOVE
и CMOVE>
можно использовать для простого повторения частей строки или реализации алгоритмов, аналогичных распаковке LZ77. а>. Это называется распространением. Например:
\ Allocate space for a string, starting with AB
CREATE str 'A' C, 'B' C, 18 CHARS ALLOT
str 2 TYPE \ prints AB
\ Use CMOVE to propagate AB over rest of string
str str 2 CHARS + 18 CMOVE
str 20 TYPE \ prints ABABABABABABABABABAB
CMOVE>
также известен как <CMOVE
в старых версиях Forth.
В некоторых фортах есть слово COPY
для простой записи содержимого блока поверх другого блока.