Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 01:44

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос к FAQ по FORTH
СообщениеДобавлено: Ср июн 28, 2006 19:56 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
и вот же когда-то сохранял файл, копировал, записывал себе "разобраться", но где-то потерялось ...

Вoпрос таков : как организовать массив в Фoрт?
помню, как бы создаются глобальные переменные, потом (или до того) слова, которые их (переменные) создают и одновременно они же позволяют индексировать массив.
Предположим, есть двухмерный массив 32-разрядных, беззнаковых (вроде unsigned int в СИ) или что-то в этом духе ...
Как его создать, как с ним работать?

Может я считал что-то старое и в совр. Фортах есть стандартные средства организации массивов?

Всё это связано с организацией памяти в Форт... В старых книгах речь о неких Фреймах, объём доступной памяти для данных вследствие фреймовой организации ограничен ... Это, ясное дело устарело (откуда бы взялись 32-разрядные Форты). Но как организована память? Остались какие-нибудь фреймы, сегменты? Где ФИЗИЧЕСКИ лежит массив, куда смотреть, чтобы понять, где он лежит? Можно ли получить указатель на элемент массива?

p.s. Судя по медленной работе тестируемого форта (в одной из тем, не могу сразу вспомнить какой) с массивами, стандартных средств нет?

p.p.s. Из help к smal32 я "понял" :shock: , что массив представляет собой словарную статью?


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Массив может быть словарной статьей, и обычно так и делается для статичных массивов.
Далее следует Форт-исходник, который я напечатал прямо здесь, т.е. он НЕ проверен! Думаю, проверить не составит труда ни у кого... Работать оно должно на 16-тиразрядном форте.

Код:
( Самый простой способ создания массива: )

2 CONSTANT SELL \ размер ячейки
( это слово может быть уже определено в Фортсистеме )
100 SELL * CONSTANT SIZE-M

CREATE MASSIVE SIZE-M ALLOT

( Теперь, при вызове слова MASSIVE на стеке будет оказываться адрес начала массива. Всю остальную индексацию, проверку на выход за границы, присвоение и вытаскивание должен организовывать программист. )

: m! ( ..., data, index, adress-massive  -> ...) OVER + + ! ;
: m@ ( ..., index, adress-massive -> ..., data) OVER + + @ ;

( В данном случае организован массив из 100 ячеек размером SELL байтов и слова присвоения/разымвнования БЕЗ проверки на выход за границы массива.)

\ применние

: test 10 0 DO I DUP MASSIVE m! LOOP ; \ заполнение
\ первых 10 ячеек массива номерами самих ячеек

: test2 100 0 DO I MASSIVE m@ H. LOOP ; \ распечатка
\ в шестнадцатеричном формате всего массива.



P.S. На счет "стандартных" средств форта ничего сказать не могу - не в курсе, есть такие или нет в ANS94...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Стандартных средств в форте для создания массива нет, но есть все для этого необходимое.

Что касается самих массивов - они, как и в Си могут быть статическими и динамическими.
И в том и в другом случае выделять память и индексировать элементы массива придется в ручную.

Создавать словарную статью для того, чтобы получить массив не обязательно -так делается только тогда, когда этот массив необходим в единственном и неповторимом экземпляре ;)

Итак:
можно просто создать массив по ALLOT

HERE 1000 ALLOT \ вы получите на вершине стека адрес статического неименованого массива

CREATE massive 1000 ALLOT \ вы получите именованную константу massive, которая будет выкладывать
\ адрес начала массива.
1000 ALLOCATE THROW \ на вершине стека будет адрес начала динамического массива, который в
\ последствии придется освобождать с помощью
FREE

Может есть что-нибудь еще;) Мне было это не нужно.

Итак, если форт не умеет работать с динамической памятью, то массивы создаются обычно статические и именованные. Если работа с динамической памятью присутствует, как например в SPF3-4, то статические массивы создаются очень маленькие и очень редко - все данные идут в динамическую память и выделяются по-ALLOCATE. Да кроме того в СПФ есть возможность создания динамического словаря- я сам этим средством не пользовался, но по идее в таких словарях можно создавать именованные массивы в хипе.

С уважением Олег


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Вопрос к FAQ по FORTH
СообщениеДобавлено: Чт июн 29, 2006 12:14 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
вопрос писал(а):
Но как организована память? Остались какие-нибудь фреймы, сегменты? Где ФИЗИЧЕСКИ лежит массив, куда смотреть, чтобы понять, где он лежит? Можно ли получить указатель на элемент массива?


Не знаю что за фреймы.
Одним из основопологающих компонетнтов Форта является кодофайл.
Это область памяти в которой и распологается образ форт-системы.
Эта область примыкает к следующему за ней своботному пространству для
расширения системы. Комманда HERE кладет на стек указатель на вершуну
кодофайла(граница между занятой и свободной облястью).
Команда ALLOT ( n -- ) продвигает этот указатель.
Команда CREATE <name> создаст команду с именем <name> возращает указатель
на сдеующую за ней область. Тоесть <name> HERE будут возвращать
одно и тоже значение, до тех пор пока HERE не будет продвинцто.
Команда , ( n -- ) кладет n на вершину кодофайла

Код:
\ test
CR .( X=) HERE U.
CREATE MASSIVE
CR .( Y=) HERE U.  MASSIVE U.
10 ALLOT
CR .( Z=) HERE U.  MASSIVE U.

6 , 9 ,

CR .( Z=) HERE U.  MASSIVE U.

MASSIVE 20 DUMP



Цитата:
p.s. Судя по медленной работе тестируемого форта (в одной из тем, не могу сразу вспомнить какой) с массивами, стандартных средств нет?

p.p.s. Из help к smal32 я "понял" :shock: , что массив представляет собой словарную статью?


К smal32 нет исходных текстов. Форт очень просто устроен.
Трудно освоить Форт не разобравшись с исходными текстами Форта.
Если есть WINDOWS рекомендую:

http://sourceforge.net/projects/spf/
или
http://sourceforge.net/projects/win32forth

[/code]


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 29, 2007 06:57 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Не знал куда поместить,
но есть такой не сильно соответствующий текущему состоянию дел
с Форт языком.

http://faqs.org.ru/progr/other_l/forth.htm

P.S. Пора его там обновить:)


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

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Англоязычный FAQ датируется 2000г.

http://www.faqs.org/faqs/computer-lang/forth-faq/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 08, 2007 06:46 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Здесь есть еще один FAQ от comp.lang.forth
( дата файлов в каталоге 2003г.)

http://www.opennet.ru/docs/FAQ/programming/Other/


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Вопрос к FAQ по FORTH
СообщениеДобавлено: Вт авг 21, 2012 01:30 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Прочитал этот старый топик. Ну стыдно, господа-товарищи... :oops:
Человек спросил про то как на Форте создаются массивы и никто не дал ему ответ, выдержанный в идеологии и соответствующий духу Форта.

В Форте есть механизм порождения понятий. Поэтому если понятия "массив" в Форте нет, то просто нужно его породить. Вот так :

: ARRAY CREATE CELLS ALLOT DOES> SWAP CELLS + ; \ Понятие массива ячеек
: C-ARRAY CREATE ALLOT DOES> + ; \ Понятие массива символов

После чего, создание массива ячеек, например BUFFER на 100 элементов будет :
100 ARRAY BUFFER
Адрес его, к примеру, 5-го (считая с нуля) элемента будет
5 BUFFER
, а его значение
5 BUFFER @

Аналогичное для массива из 100 символов :
100 C-ARRAY BUFFER
5 BUFFER
5 BUFFER C@



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

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


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

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


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

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