Программист – Программирование на gforth (страница 11)
Можно создать и инициализировать переменную сразу:
CREATE my-var 123 ,
Здесь: * CREATE — создаёт новое слово; * 123 — начальное значение; * , — записывает значение в память.
Чтение и запись:
my-var @ . \ Выводит 123
456 my-var ! \ Записываем новое значение
my-var @ . \ Выводит 456
4. Массивы
В Forth массивы создаются с помощью CREATE и ALLOT.
Создание массива из 10 целых чисел:
CREATE int-array 10 CELLS ALLOT
Где: * CELLS — размер одного элемента (обычно 4 байта); * ALLOT — выделяет память.
Доступ к элементам: * индекс CELLS массив + — адрес элемента; * @ / # — чтение/запись.
Пример работы с массивом:
: array-set ( значение индекс массив -- )
CELLS + ! ;
: array-get ( индекс массив -- значение )
CELLS + @ ;
Использование:
5 0 int-array array-set \ Записываем 5 в элемент 0
2 1 int-array array-set \ Записываем 2 в элемент 1
0 int-array array-get . \ Выводит 5
1 int-array array-get . \ Выводит 2
5. Динамическое выделение памяти
Для динамического выделения памяти используются: * ALLOCATE — выделяет блок памяти, возвращает адрес и флаг успеха; * FREE — освобождает память; * RESIZE — изменяет размер блока.
Пример динамического массива:
VARIABLE dynamic-array
VARIABLE array-size
: create-dynamic ( размер -- )
CELLS ALLOCATE IF
." Ошибка выделения памяти" CR
DROP
ELSE
dynamic-array !
array-size !
THEN ;
: free-dynamic
dynamic-array @ FREE DROP ;
6. Строки и работа с текстом
В Gforth строки можно создавать разными способами:
Способ 1: CREATE с C,"
CREATE message C," Hello, world!"
Способ 2: S"
S" Hello" CONSTANT greeting
Операции со строками: * COUNT — получает адрес и длину строки; * TYPE — выводит строку на экран.
Пример:
message COUNT TYPE \ Выводит "Hello, world!"
greeting COUNT TYPE \ Выводит "Hello"
Создание изменяемой строки:
CREATE buffer 256 ALLOT \ Буфер на 256 байт
: set-string ( адрес-строки длина -- )
buffer SWAP CMOVE ; \ CMOVE копирует строку
: print-buffer
buffer COUNT TYPE CR ;
Использование:
S" Test string" set-string
print-buffer \ Выводит "Test string"
7. Указатели и адреса памяти
В Forth можно напрямую работать с адресами памяти:
•
ADDR
— получает адрес переменной/массива;
•
CELL+
— смещение на один элемент;