Сначала необходимо убедиться, что представление данных является точным.
Литеральная строка в Форте получается с использованием слова s"
, поэтому вы должны написать, например:
s" This" ok
После ввода, если вы сделаете .s
, вы увидите два значения:
.s <2> 7791776 4 ok
Это указатель на фактическую строку (массив символов) и подсчет количества символов в строке. Некоторые слова в Forth понимают это строковое представление. type
является одним из них. Если вы сейчас введете type
, вы получите строку, напечатанную на дисплее:
type This ok
Итак, теперь вы знаете, что вам нужны две ячейки для представления строки, полученной с помощью s"
. Ваш create
должен принять это во внимание и использовать слово 2,
для хранения 2 ячеек на запись, а не ,
, которое хранит только одну ячейку:
create myStringArray
s" This" 2,
s" is" 2,
s" an" 2,
s" array" 2,
s" of" 2,
s" strings" 2,
Это массив пар адрес/счетчик для строк. Если вы хотите получить доступ к одному из них, вы можете сделать это следующим образом:
: myString ( u1 -- caddr u1 ) \ given the index, get the string address/count
\ fetch 2 cells from myStringArray + (sizeof 2 cells)*index
myStringArray swap 2 cells * + 2@ ;
Разбивая это, вам нужно взять базу вашей переменной массива myStringArray
и добавить к ней правильное смещение к нужному строковому адресу/количеству. Это смещение представляет собой размер записи массива (2 ячейки), умноженный на индекс (который находится в стеке данных). Таким образом, выражение myStringArray swap 2 cells * +
. Затем следует 2@
, который извлекает двойное слово (адрес и количество) в этом месте.
Использовать...
3 myString type array ok
0 myString type This ok
и т.д...
Теперь, когда вы знаете основы индексации массива, «лучшая практика» сортировки будет следовать обычной передовой практике выбора алгоритма сортировки для типа массива, который вы хотите отсортировать. В этом случае пузырьковая сортировка, вероятно, подходит для очень небольшого массива строк. Вы должны использовать слово compare
для сравнения двух строк. Например:
s" This" 0 myString compare .s <1> 0 ok
Результат 0
означает, что строки равны.
person
lurker
schedule
02.04.2018