Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб июл 11, 2020 20:19

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - именованные "карманы" для массивов (строк)
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
добро дня
свои 5 копеек на тему
правда тут не карман а целый шкаф для строк

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

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

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

сюда постить текстом не буду,
исходное в архиве если интересно http://www.refinish-auto.ru/1.zip
Сообщение Добавлено: Вт дек 01, 2009 14:06
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
Но помоему вот этого не должно быть в стековой диаграмме так как это не входной аргумент слова
хотя для DOES> части, он таковым и является, но вообщем так как addr появляется автоматически то
в аргументах ему делать нечего он только с толку сбивает ( или я не прав??)

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

Кстати, насчет DOES> подумалось, что параметр было бы удобно оставлять на стеке возвратов, по крайней мере для случаев, когда этот адрес используется многократно.
Сообщение Добавлено: Пн ноя 30, 2009 18:25
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
эм, ну это ведь стандартная конструкция CREATE DOES>

Извиняюсь до меня чуть по позже дошло.
Но помоему вот этого не должно быть в стековой диаграмме так как это не входной аргумент слова
хотя для DOES> части, он таковым и является, но вообщем так как addr появляется автоматически то
в аргументах ему делать нечего он только с толку сбивает ( или я не прав??)
Сообщение Добавлено: Пн ноя 30, 2009 18:11
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
Скорее я не понял, может пример?
А то совсем не понятно откуда этот адрес возьмется

эм, ну это ведь стандартная конструкция CREATE DOES>
<pre>
: sample CREATE 123 ,
DOES> ( тут будет лежать адрес, где расположилось 123 ) ;
</pre>
Сообщение Добавлено: Пн ноя 30, 2009 09:00
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
или я чего не понял?

Скорее я не понял, может пример?
А то совсем не понятно откуда этот адрес возьмется
Сообщение Добавлено: Пн ноя 30, 2009 00:44
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
Помоему коментарии перед словом POCKET
не соответствуют стековой диаграмме после DOES> ???

эм, там addr на входе, это адрес CREATE части (где хранятся данные)
или я чего не понял?
Сообщение Добавлено: Вс ноя 29, 2009 15:26
  Заголовок сообщения:   Ответить с цитатой
Помоему коментарии перед словом POCKET
не соответствуют стековой диаграмме после DOES> ???
Сообщение Добавлено: Сб ноя 28, 2009 23:41
  Заголовок сообщения:  именованные "карманы" для массивов (строк)  Ответить с цитатой
Иногда надо хранить данные (часто строки) в буфере, таким образом, чтобы этими данными можно было в любой момент воспользоваться, и при этом, во-первых, не хочется (или нельзя) выделять фиксированное место фиксированного размера, во-вторых, не хочется помнить о том, что выделенную память надо освобождать, и в-третьих, вообще хочется забыть о том, как хранятся данные и конечно же обойтись без "сборки мусора".

В случае со словом 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>
Сообщение Добавлено: Сб ноя 07, 2009 16:01

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


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