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

Вопрос чайника
http://www.fforum.winglion.ru/viewtopic.php?f=23&t=2747
Страница 1 из 2

Автор:  KatastrofaS [ Пн авг 08, 2011 00:30 ]
Заголовок сообщения:  Вопрос чайника

Вот такая прога выбивает quark.exe в ОС:
: C BEGIN ." Приветики..." AGAIN ;
C
На экране ничего не появляется. Что не так делаю?

Автор:  Hishnik [ Пн авг 08, 2011 00:35 ]
Заголовок сообщения:  Re: Вопрос чайника

Надо внутрь поставить слово "$" (без кавычек). Это "прокачка" цикла сообщений в Windows. Сейчас получается, что на внутренний виртуальный экран выводятся символы, но программа не может отработать сообщение "перерисовка окна".

Автор:  Hishnik [ Пн авг 08, 2011 00:39 ]
Заголовок сообщения:  Re: Вопрос чайника

Описание лежит на http://www.msyst.ru/quark.pdf

Автор:  KatastrofaS [ Пн авг 08, 2011 01:04 ]
Заголовок сообщения:  Re: Вопрос чайника

Спасибо, теперь выводится нормально.
Как прервать цикл, оставаясь в консоли?

Автор:  Hishnik [ Пн авг 08, 2011 01:14 ]
Заголовок сообщения:  Re: Вопрос чайника

KatastrofaS писал(а):
Как прервать цикл, оставаясь в консоли?

Эээ... никак :) AGAIN не прерывается. Чтобы прервать, надо писать цикл BEGIN UNTIL. Если будет работать прокачка сообщений, то консоль будет функционировать и в процессе выполнения цикла.

Автор:  KatastrofaS [ Пн авг 08, 2011 01:49 ]
Заголовок сообщения:  Re: Вопрос чайника

Что-то нащупал:
: MESSA ." Кранты" BYE ;
' MESSA TO K_ESC
Теперь бы знать эквивалент слова ABORT из стандарта 83, которое прерывает задачу и инициирует стандартную чистую консоль.

Ну и огромное спасибо! Ещё немного - и я погружаюсь в Кварк )

Автор:  Hishnik [ Пн авг 08, 2011 02:19 ]
Заголовок сообщения:  Re: Вопрос чайника

ABORT есть, но, как выяснилось, не работает, будучи вызванным как слово Форта. :shuffle; Обычная практика - введение переменной USER_BREAK, которая проверяется в UNTIL. А поскольку прокачка сообщений работает не только для отрисовки, можно сделать так

Код:
VARIABLE USER_BREAK

: BREAK! USER_BREAK ON ;
' BREAK! TO K_ESC

: MAIN
  0 USER_BREAK !
  BEGIN
    10 10 GOTOXY 1 . $
  USER_BREAK @ UNTIL
  10 10 GOTOXY 32 EMIT // убедились, что действительно выходим
;
     

Автор:  Гость [ Чт сен 08, 2011 16:22 ]
Заголовок сообщения:  Re: Вопрос чайника

Недавно начал изучать Форт, пользую quark, добрался до массивов и наткнулся на непонятную вещь:
CREATE XM[] 10 ALLOT
6 0 XM[] + !
5 1 XM[] + !
4 2 XM[] + !
0 XM[] + @ .
1 XM[] + @ .
2 XM[] + @ .
Результат: 263430 1029 4
В чем ошибка то ???
Ну и еще вопрос можно ли делать n-мерные массивы (желательно пример)

Автор:  _Harry [ Чт сен 08, 2011 16:35 ]
Заголовок сообщения:  Re: Вопрос чайника

Гость писал(а):
В чем ошибка то ???

6 0 XM[] + !
А вот в чем нужно писать :
либо
Код:
5 1  CELLS XM[] + ! \ Упаковка в ячейки 32 разряда
.........................
       1 CELLS XM[] + @ . \ соответственно достаем из ячейки


либо
Код:
5 1  XM[] + B! \ Упаковка в байты
.........................
       1 XM[] + B@ .


P.S. Не уверен есть ли вы кварке В! B@
может что то другое что пишет и читает байты :roll:

Автор:  chess [ Чт сен 08, 2011 16:39 ]
Заголовок сообщения:  Re: Вопрос чайника

Гость писал(а):
CREATE XM[] 10 ALLOT
6 0 XM[] + !
5 1 XM[] + !
4 2 XM[] + !
0 XM[] + @ .
1 XM[] + @ .
2 XM[] + @ .
Результат: 263430 1029 4
В чем ошибка то ???

надо или так
6 0 XM[] + C!
5 1 XM[] + C!
4 2 XM[] + C!
0 XM[] + C@ .
1 XM[] + C@ .
2 XM[] + C@ .
или так
6 0 XM[] + !
5 4 XM[] + !
4 8 XM[] + !
0 XM[] + @ .
4 XM[] + @ .
8 XM[] + @ .
Операции ! и @ работают с ячейкой, а ячейка это четыре байта

Автор:  WingLion [ Чт сен 08, 2011 18:21 ]
Заголовок сообщения:  Re: Вопрос чайника

A eще имеет смысл сделать:

Код:
: XM[]! ( data,index --> ) CELLS XM[] + ! ;
: XM[]@ ( index --> data ) CELLS XM[] + @ ;


И после этого писать:

Код:
6 0 XM[]!
5 1 XM[]!
4 2 XM[]!

0 XM[]@ .
1 XM[]@ .
2 XM[]@ .

Автор:  Hishnik [ Чт сен 08, 2011 18:57 ]
Заголовок сообщения:  Re: Вопрос чайника

Еще в кварке есть слово -TH (от 5 -th, т.е. 5 -е). Оно вычисляет адрес ячейки по начальному адресу массива и индексу ячейки. Т.е. для чтения из 3-го элемента XM[] надо написать XM[] 3 -TH @. Для вещественных чисел существует -FTH.

Работа с байтами - C@ C! (от CHAR).

Многомерный массив отдельно не существует, это несколько маленьких массивов, объединенных в большой одномерный. Если есть его размеры XMAX, YMAX, то индекс вычисляется как Y*XMAX+X.

Автор:  white_TigR [ Пт сен 09, 2011 08:19 ]
Заголовок сообщения:  Re: Вопрос чайника

Гость писал(а):
Код:
CREATE XM[] 10 ALLOT

Создаст массив на 2.5 стандартных integer, т.к. они занимают 4 байта, а выделено всего 10.
Лучше
Код:
CREATE XM[] 3 CELLS ALLOT

Автор:  Гость [ Пт сен 09, 2011 12:38 ]
Заголовок сообщения:  Re: Вопрос чайника

Всем огромное спасибо!!!! Теперь все работает как надо.

WingLion писал(а):
A eще имеет смысл сделать:

Код:
: XM[]! ( data,index --> ) CELLS XM[] + ! ;
: XM[]@ ( index --> data ) CELLS XM[] + @ ;



Естественно уже сделал без таких вещей никуда!

Автор:  VoidVolker [ Сб сен 10, 2011 16:09 ]
Заголовок сообщения:  Re: Вопрос чайника

Гость, еще стоит покопаться в старых темах этого подраздела в поисках вкусного кода.

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