Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Ср дек 12, 2018 16:44

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: именованные "карманы" для массивов (строк)
СообщениеДобавлено: Сб ноя 07, 2009 16:01 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
Иногда надо хранить данные (часто строки) в буфере, таким образом, чтобы этими данными можно было в любой момент воспользоваться, и при этом, во-первых, не хочется (или нельзя) выделять фиксированное место фиксированного размера, во-вторых, не хочется помнить о том, что выделенную память надо освобождать, и в-третьих, вообще хочется забыть о том, как хранятся данные и конечно же обойтись без "сборки мусора".

В случае со словом 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>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Последний раз редактировалось mOleg Вс ноя 29, 2009 16:09, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 28, 2009 23:41 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
Помоему коментарии перед словом POCKET
не соответствуют стековой диаграмме после DOES> ???


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 29, 2009 15:26 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
_Harry писал(а):
Помоему коментарии перед словом POCKET
не соответствуют стековой диаграмме после DOES> ???

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 30, 2009 00:44 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
mOleg писал(а):
или я чего не понял?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 30, 2009 09:00 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
_Harry писал(а):
Скорее я не понял, может пример?
А то совсем не понятно откуда этот адрес возьмется

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 30, 2009 18:11 
Не в сети
Аватара пользователя

Зарегистрирован: Пт дек 26, 2008 21:16
Сообщения: 407
Откуда: Великий Новгород
Благодарил (а): 9 раз.
Поблагодарили: 3 раз.
mOleg писал(а):
эм, ну это ведь стандартная конструкция CREATE DOES>

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 30, 2009 18:25 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4956
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
_Harry писал(а):
Но помоему вот этого не должно быть в стековой диаграмме так как это не входной аргумент слова
хотя для DOES> части, он таковым и является, но вообщем так как addr появляется автоматически то
в аргументах ему делать нечего он только с толку сбивает ( или я не прав??)

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

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт дек 01, 2009 14:06 
Не в сети
Аватара пользователя

Зарегистрирован: Пт май 05, 2006 06:19
Сообщения: 192
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
добро дня
свои 5 копеек на тему
правда тут не карман а целый шкаф для строк

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

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

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

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

_________________
SPF


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB