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/ |