Forth
http://www.fforum.winglion.ru/

именованные "карманы" для массивов (строк)
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2306
Страница 1 из 1

Автор:  mOleg [ Сб ноя 07, 2009 16:01 ]
Заголовок сообщения:  именованные "карманы" для массивов (строк)

Иногда надо хранить данные (часто строки) в буфере, таким образом, чтобы этими данными можно было в любой момент воспользоваться, и при этом, во-первых, не хочется (или нельзя) выделять фиксированное место фиксированного размера, во-вторых, не хочется помнить о том, что выделенную память надо освобождать, и в-третьих, вообще хочется забыть о том, как хранятся данные и конечно же обойтись без "сборки мусора".

В случае со словом POCKET создается именованный карман, которым можно пользоваться при работе с массивами байт, точнее со строками. Если на входе у полученного слова будет 0, то слово вернет адрес и длину хранимой в хипе строки (если она там есть, иначе просто FALSE) Если на входе у полученного слова будет адрес и длина (ненулевая) , то строка сохранится в карман, и сразу будут получены адрес и длина полученной строки.

Слово BOCKET в отличие от POCKET не копирует исходные данные, а просто выделяет в ХИПе место, под массив указанного размера. В остальном поведение слов совпадает. Память выделяется в локальном ХИПе потока, поэтому эти слова нельзя использовать для обмена данными между потоками а так же между потоком и системой, для этого см. gocket.fts

<pre>
\ 06.11.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ карман для строк и массивов

\ создать строковую пользовательскую переменную со следующим поведением
\ если на входе 0 - вернуть хранимую строку
\ если на входе число отличное от нуля, считать его счетчиком строки
\ коприровать строку в хип, вернуть адрес и длину строки в хипе
\ в случае, если ранее в кармане была строка, удалить ее
: POCKET ( / name --> )
CREATE CELL USER-PLACE ,
DOES> ( asc # addr | 0 addr --> asc # | 0 )
@ TlsIndex@ + A>L
*IF S>HEAP DUP AL> ACHANGE
*IF FREE THEN DROP COUNT
;THEN DROP
AL> A@ *IF COUNT THEN ;

\ создать именованный буфер\карман
\ если на входе 0 - вернуть адрес и длину ранее выделенного буфера
\ если на входе число, отличное от нуля, старый буфер освободить
\ выделить место под новый буфер, вернуть адрес начала и длину буфера
\ в случае неуспеха вернуть 0 ,
\ ошибка выделения пространства под буфер: THROW
: BOCKET ( / name --> )
CREATE ADDR CELL + USER-PLACE ,
DOES> ( # | 0 --> addr # | 0 )
@ TlsIndex@ +
OVER *IF ALLOCATE THROW
OVER ACHANGE *IF FREE THEN DROP
TUCK ADDR + !
ELSE DROP NIP
THEN
DUP A@ *IF SWAP ADDR + @ ;THEN
NIP ;
</pre>

Автор:  _Harry [ Сб ноя 28, 2009 23:41 ]
Заголовок сообщения: 

Помоему коментарии перед словом POCKET
не соответствуют стековой диаграмме после DOES> ???

Автор:  mOleg [ Вс ноя 29, 2009 15:26 ]
Заголовок сообщения: 

_Harry писал(а):
Помоему коментарии перед словом POCKET
не соответствуют стековой диаграмме после DOES> ???

эм, там addr на входе, это адрес CREATE части (где хранятся данные)
или я чего не понял?

Автор:  _Harry [ Пн ноя 30, 2009 00:44 ]
Заголовок сообщения: 

mOleg писал(а):
или я чего не понял?

Скорее я не понял, может пример?
А то совсем не понятно откуда этот адрес возьмется

Автор:  mOleg [ Пн ноя 30, 2009 09:00 ]
Заголовок сообщения: 

_Harry писал(а):
Скорее я не понял, может пример?
А то совсем не понятно откуда этот адрес возьмется

эм, ну это ведь стандартная конструкция CREATE DOES>
<pre>
: sample CREATE 123 ,
DOES> ( тут будет лежать адрес, где расположилось 123 ) ;
</pre>

Автор:  _Harry [ Пн ноя 30, 2009 18:11 ]
Заголовок сообщения: 

mOleg писал(а):
эм, ну это ведь стандартная конструкция CREATE DOES>

Извиняюсь до меня чуть по позже дошло.
Но помоему вот этого не должно быть в стековой диаграмме так как это не входной аргумент слова
хотя для DOES> части, он таковым и является, но вообщем так как addr появляется автоматически то
в аргументах ему делать нечего он только с толку сбивает ( или я не прав??)

Автор:  mOleg [ Пн ноя 30, 2009 18:25 ]
Заголовок сообщения: 

_Harry писал(а):
Но помоему вот этого не должно быть в стековой диаграмме так как это не входной аргумент слова
хотя для DOES> части, он таковым и является, но вообщем так как addr появляется автоматически то
в аргументах ему делать нечего он только с толку сбивает ( или я не прав??)

А вот это вопрос на который я дать ответа не могу, точнее, я для себя стараюсь ничего "в уме" не держать.
Сказать, как принято сложно, так как после DOES> стековую диаграмму достаточно нечасто пишут (и я как-то не обращал внимания на то, используется ли этот адрес.

Кстати, насчет DOES> подумалось, что параметр было бы удобно оставлять на стеке возвратов, по крайней мере для случаев, когда этот адрес используется многократно.

Автор:  mrack [ Вт дек 01, 2009 14:06 ]
Заголовок сообщения: 

добро дня
свои 5 копеек на тему
правда тут не карман а целый шкаф для строк

смысл решения: создание и управлении выделенными полями в памяти

на первом уровне md.f создаются две области
- список с адресами
- область с данными
выделенная область характеризуется номером в списке - индексом.

на втором уровне field.f организуется уже создание поля с расширеными параметрами
- возможным резервом для данных в случае если поле собирается часто меняться чтоб снизить нагрузку,
- с областью данных и отдельно областью параметров если например выделеная область должна хранить не только данные но и структуру данных

сюда постить текстом не буду,
исходное в архиве если интересно http://www.refinish-auto.ru/1.zip

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/