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

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

Обзор темы - вопросы чайника, заход №2
Автор Сообщение
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Lacoste писал(а):
Тоесть мы ввели число и определили его с помощью >NUMBER

правильнее сказать распознали. Проблема только в том, что NUMBER возвращает число двойной длины.
число двойной длины - это означает, что на вершины стека лежит два числа, которые образуют одно целое число двойной разрядности.

Lacoste писал(а):
Но >NUMBER помимо самого числа запоминает адрес и длину

нет, >NUMBER на входе получает строку(которая представлена адресом начала и длиной)
и число двойной длины (обычно два нуля), возвращает так же преобразованное число и строку-остаток, длина которой при успешном завершении преобразования равна нулю.
Сообщение Добавлено: Вт май 04, 2010 18:52
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
не ) нам надо u ,

>NUMBER - это вообще самый низкий уровень представления информации
чаще NUMBER используют, но он не говрит какое число получили в 1 ячейку размером или 2

ваще так вот
Код:
0 S>D S" 12345" >NUMBER 2DROP

На вершине число в 2 ячейки, что с ним делать операцию D>S или нет - решать программисту
Сообщение Добавлено: Вт май 04, 2010 18:22
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
не ленимся и читаем про устройство строк в Форте
Сообщение Добавлено: Вт май 04, 2010 18:20
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Alexander писал(а):
Lacoste писал(а):
. А как отделить само число от адреса и длины?

если длина оставшейся строки станет 0, то надо отбросит и адрес и тогда на вершине наше число.

Было бы проще понять о чем речь если бы объяснение сопровождалось стековой нотацией. Насколько я понял из объяснения говорится о следующем.

Нотация >NUMBER:
>NUMBER (" " --> u addr n)
где:
u -- длина необработанной части строки
addr -- адрес необработанной части строки
n -- число, преобразованное из начала строки

Для получения самого числа нужно сделать:
S" 24214bfdbd"
>NUMBER (" " -- u addr n)
DROP (-- addr n)
DROP (-- n)

Я правильно понял?
Сообщение Добавлено: Вт май 04, 2010 18:10
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Спаибо, Alexander, тоесть берем верхнее число из стека :)
Сообщение Добавлено: Вт май 04, 2010 17:59
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Lacoste писал(а):
. А как отделить само число от адреса и длины?

если длина оставшейся строки станет 0, то надо отбросит и адрес и тогда на вершине наше число.
Сообщение Добавлено: Вт май 04, 2010 17:57
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Тоесть мы ввели число и определили его с помощью >NUMBER. Но >NUMBER помимо самого числа запоминает адрес и длину. А как отделить само число от адреса и длины?
I am Sorry, за очень глупые вопросы, просто после Basic'а (print, input), и Lua (io.write, io.read) непревычно превыкнуть к стековой системе, но зато очень интересно разобратся в этом удивительном конструкторе :roll:
Сообщение Добавлено: Вт май 04, 2010 17:37
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Lacoste писал(а):
Подскажите пожалуста а за что отвечает слова EKEY, NUMBER?, >NUMBER ?
С уважением ко Всем, Lacoste

EKEY - ввод с клавиатуры символа, возращает некий код содержащий в себе признаки нажатия клавиш Ctrl, Alt, Shift и еще признак так называемоего скан-кода клавиши
NUMBER? - преобразует строку определенной длины расположеную по некотрому адресу в число на стеке, формируя признак этого числа - двойной оно размерности или одинарной, или вообще нет числа там при вводе (зависит от системы счисления установленной перменной BASE)
>NUMBER - преобразует строку до первого символа отличного от цифры, оставляя на стеке помимо полученного числа, информацию о непреобразованных символах в строке (адрес и длина).
Сообщение Добавлено: Вт май 04, 2010 17:17
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Подскажите пожалуста а за что отвечает слова EKEY, NUMBER?, >NUMBER ?
С уважением ко Всем, Lacoste
Сообщение Добавлено: Вт май 04, 2010 17:02
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
проблема в сворачиваниии числового диапазона в кольцо.
Если вы действительно хотите оперировать какими-то числами в произвольном диапазоне и не думать ни о чем, то придется посмотреть что делали люди до того. Например, FSL(Forth Scientific Library) содержит что-то подобное в строках файла big.f, или взять полиномиальное представление чисел с заданным основанием системы счисления.
Код:
\ вводим число, по окончании ввода на вершине стека число двойной размерности
: ?INPUT (  -  | d )
    PAD 23 BLANK            \ заполнять обязательно пробелами, и ничем иначе
    PAD 21 ACCEPT           \ собственно ввод
    PAD SWAP NUMBER?        \ преобразование строку ввода в число
    1- ?DUP IF  1- THROW    \ генерируем исключение в случае ошибки преобразования
    ELSE  S>D  THEN ;       \ если число одинарной размерности, то его преобразуем

\ обработчик ввода   
: (INPUT) ( - d )
    ['] ?INPUT CATCH         \ защищаем ввод, так как неизвестно, что может твориться в ЭВМ
    ?DUP IF CR ." INCORRECT" \ уведомляем пользователя о неправильном вводе
            THROW  THEN ;    \ заставляем вызвавшее слово, повторить процедуру сначала

: INPUT ( xt - d )   
    BEGIN
        DUP EXECUTE         \ отображаем приглашение ввода
        ['] (INPUT) CATCH
    0= UNTIL  ROT DROP ;    \ удаляем токен-указатель на приглашение ввода

\ различные сообщения выводимые на экран
: ."A="  CR ." A=" ;
: ."B="  CR ." B=" ;
: ."A+B="  CR ." A+B=" ;

\ собственно тело программы
: MAIN
   ['] ."A=" INPUT
   ['] ."B=" INPUT
   ."A+B=" D+ D. ;

вот такой вот получился код, преследуя универсальность он сильно раздулся
Попробуй использовать это определение, может имелось ввиду особенность работы слова преобразователя, сообщая что не так числа преобразуются:
Код:
: ?INPUT (  -  | d )
    PAD 22 BLANK            \ заполнять обязательно пробелами, и ничем иначе
    PAD 21 ACCEPT           \ собственно ввод
    [CHAR] , OVER PAD + C!  \ допишем знак для нужного преобразования
    PAD SWAP 1+ NUMBER?     \ преобразование строку ввода в число
    2- THROW ;              \ теперь это выход с уведомлением о том, как прошло преобразование
Сообщение Добавлено: Вт май 04, 2010 13:01
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Гость писал(а):
Если ввести больше 12 цифр - 1000000000000 то почему работает неправильно?

потому что используется NUMBER? скорее всего возвращающий то число одинарной длины, то число двойной длины.
это как раз один из тех моментов, на который намекал WingLion ;)

P.S.
вы бы все-таки входили как пользователь.
Сообщение Добавлено: Пн май 03, 2010 21:53
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Гость писал(а):
[quote="Alexander]
Еще можно поиграться )[/quote]
Код:
REQUIRE NUMBER?   ~mak\lib\fpcnum.f

: ?INT-INPUT (  - n f )
   PAD 16 ERASE 
   PAD DUP 12 ACCEPT  NUMBER? INVERT THROW 
;
: INPUT ( - n )
      BEGIN
         ['] ?INT-INPUT CATCH DUP IF CR ." INCORRECT" 1 THROW THEN
      0= UNTIL ;
: MAIN
  BEGIN CR ." A=" ['] INPUT CATCH 0= UNTIL
  BEGIN CR ." B=" ['] INPUT CATCH 0= UNTIL
  CR ." A+B="
  D+
  D.
;
MAIN
[/quote]


Если ввести больше 12 цифр - 1000000000000 то почему работает неправильно?
Сообщение Добавлено: Пн май 03, 2010 21:02
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
а вообще, ребяты, лучше думать не только о себе, и создавать для нового вопроса новую тему. Например, а как же ловятся исключения? или: как ввести число?
Сообщение Добавлено: Пн май 03, 2010 18:12
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Еще раз спасибки.
вот что хотел показать, вроде удалось
Код:
: ?INT-INPUT (  - n f )
   PAD 16 BLANK  PAD 12 ACCEPT  PAD SWAP NUMBER?  DUP 2 = IF 2NIP THEN 1- THROW ;
: Input ( - n )
      BEGIN
         ['] ?INT-INPUT CATCH DUP IF CR ." INCORRECT" 1 THROW THEN
     0= UNTIL ;
: MAIN
  BEGIN CR ." A=" ['] INPUT CATCH 0= UNTIL
  BEGIN CR ." B=" ['] INPUT CATCH 0= UNTIL
  CR ." A+B=" +
  . ;

Еще можно поиграться )
Сообщение Добавлено: Пн май 03, 2010 17:55
  Заголовок сообщения:  Re: вопросы чайника, заход №2  Ответить с цитатой
Alexander писал(а):
покажите пример использования структуры catch .. throw.


: some-thing ." может быть два варианта развития событий:" IF ." без ошибки" ELSE ." c ошибкой" 123456 THROW THEN ;

: some-other ['] some-thing CATCH IF ." ошибочка вышла: " . THEN ;

1 some-other
0 some-other
Сообщение Добавлено: Пн май 03, 2010 17:31

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


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