Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
Lacoste писал(а): Тоесть мы ввели число и определили его с помощью >NUMBER правильнее сказать распознали. Проблема только в том, что NUMBER возвращает число двойной длины. число двойной длины - это означает, что на вершины стека лежит два числа, которые образуют одно целое число двойной разрядности. Lacoste писал(а): Но >NUMBER помимо самого числа запоминает адрес и длину нет, >NUMBER на входе получает строку(которая представлена адресом начала и длиной) и число двойной длины (обычно два нуля), возвращает так же преобразованное число и строку-остаток, длина которой при успешном завершении преобразования равна нулю.
[quote="Lacoste"]Тоесть мы ввели число и определили его с помощью >NUMBER[/quote] правильнее сказать распознали. Проблема только в том, что NUMBER возвращает число двойной длины. число двойной длины - это означает, что на вершины стека лежит два числа, которые образуют одно целое число двойной разрядности.
[quote="Lacoste"]Но >NUMBER помимо самого числа запоминает адрес и длину[/quote] нет, >NUMBER на входе получает строку(которая представлена адресом начала и длиной) и число двойной длины (обычно два нуля), возвращает так же преобразованное число и строку-остаток, длина которой при успешном завершении преобразования равна нулю.
|
|
|
|
Добавлено: Вт май 04, 2010 18:52 |
|
|
|
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
не ) нам надо u , >NUMBER - это вообще самый низкий уровень представления информации чаще NUMBER используют, но он не говрит какое число получили в 1 ячейку размером или 2 ваще так вот Код: 0 S>D S" 12345" >NUMBER 2DROP На вершине число в 2 ячейки, что с ним делать операцию D>S или нет - решать программисту
не ) нам надо u ,
>NUMBER - это вообще самый низкий уровень представления информации чаще NUMBER используют, но он не говрит какое число получили в 1 ячейку размером или 2
ваще так вот [code]0 S>D S" 12345" >NUMBER 2DROP [/code] На вершине число в 2 ячейки, что с ним делать операцию D>S или нет - решать программисту
|
|
|
|
Добавлено: Вт май 04, 2010 18:22 |
|
|
|
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
не ленимся и читаем про устройство строк в Форте
не ленимся и читаем про [url=http://fforum.winglion.ru/viewtopic.php?f=34&t=623]устройство строк в Форте[/url]
|
|
|
|
Добавлено: Вт май 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) Я правильно понял?
[quote="Alexander"][quote="Lacoste"]. А как отделить само число от адреса и длины?[/quote] если длина оставшейся строки станет 0, то надо отбросит и адрес и тогда на вершине наше число.[/quote] Было бы проще понять о чем речь если бы объяснение сопровождалось стековой нотацией. Насколько я понял из объяснения говорится о следующем.
Нотация >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, тоесть берем верхнее число из стека
Спаибо, Alexander, тоесть берем верхнее число из стека :)
|
|
|
|
Добавлено: Вт май 04, 2010 17:59 |
|
|
|
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
Lacoste писал(а): . А как отделить само число от адреса и длины? если длина оставшейся строки станет 0, то надо отбросит и адрес и тогда на вершине наше число.
[quote="Lacoste"]. А как отделить само число от адреса и длины?[/quote] если длина оставшейся строки станет 0, то надо отбросит и адрес и тогда на вершине наше число.
|
|
|
|
Добавлено: Вт май 04, 2010 17:57 |
|
|
|
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
Тоесть мы ввели число и определили его с помощью >NUMBER. Но >NUMBER помимо самого числа запоминает адрес и длину. А как отделить само число от адреса и длины? I am Sorry, за очень глупые вопросы, просто после Basic'а (print, input), и Lua (io.write, io.read) непревычно превыкнуть к стековой системе, но зато очень интересно разобратся в этом удивительном конструкторе
Тоесть мы ввели число и определили его с помощью >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 - преобразует строку до первого символа отличного от цифры, оставляя на стеке помимо полученного числа, информацию о непреобразованных символах в строке (адрес и длина).
[quote="Lacoste"]Подскажите пожалуста а за что отвечает слова EKEY, NUMBER?, >NUMBER ? С уважением ко Всем, Lacoste[/quote] EKEY - ввод с клавиатуры символа, возращает некий код содержащий в себе признаки нажатия клавиш Ctrl, Alt, Shift и еще признак так называемоего скан-кода клавиши NUMBER? - преобразует строку определенной длины расположеную по некотрому адресу в число на стеке, формируя признак этого числа - двойной оно размерности или одинарной, или вообще нет числа там при вводе (зависит от системы счисления установленной перменной BASE) >NUMBER - преобразует строку до первого символа отличного от цифры, оставляя на стеке помимо полученного числа, информацию о непреобразованных символах в строке (адрес и длина).
|
|
|
|
Добавлено: Вт май 04, 2010 17:17 |
|
|
|
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
Подскажите пожалуста а за что отвечает слова EKEY, NUMBER?, >NUMBER ? С уважением ко Всем, Lacoste
Подскажите пожалуста а за что отвечает слова 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 ; \ теперь это выход с уведомлением о том, как прошло преобразование
проблема в сворачиваниии числового диапазона в кольцо. Если вы действительно хотите оперировать какими-то числами в произвольном диапазоне и не думать ни о чем, то придется посмотреть что делали люди до того. Например, FSL(Forth Scientific Library) содержит что-то подобное в строках файла big.f, или взять полиномиальное представление чисел с заданным основанием системы счисления. [code]\ вводим число, по окончании ввода на вершине стека число двойной размерности : ?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. ;[/code] вот такой вот получился код, преследуя [color=#FF0000]универсальность[/color] он сильно [color=#FF0000]раздулся[/color] Попробуй использовать это определение, может имелось ввиду особенность работы слова преобразователя, сообщая что не так числа преобразуются: [code]: ?INPUT ( - | d ) PAD 22 BLANK \ заполнять обязательно пробелами, и ничем иначе PAD 21 ACCEPT \ собственно ввод [CHAR] , OVER PAD + C! \ допишем знак для нужного преобразования PAD SWAP 1+ NUMBER? \ преобразование строку ввода в число 2- THROW ; \ теперь это выход с уведомлением о том, как прошло преобразование[/code]
|
|
|
|
Добавлено: Вт май 04, 2010 13:01 |
|
|
|
|
|
Заголовок сообщения: |
Re: вопросы чайника, заход №2 |
|
|
Гость писал(а): Если ввести больше 12 цифр - 1000000000000 то почему работает неправильно? потому что используется NUMBER? скорее всего возвращающий то число одинарной длины, то число двойной длины. это как раз один из тех моментов, на который намекал WingLion P.S. вы бы все-таки входили как пользователь.
[quote="Гость"]Если ввести больше 12 цифр - 1000000000000 то почему работает неправильно?[/quote] потому что используется 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 то почему работает неправильно?
[quote="Гость"][quote="Alexander] Еще можно поиграться )[/quote] [code] 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 [/code][/quote][/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=" + . ; Еще можно поиграться )
Еще раз спасибки. вот что хотел показать, вроде удалось [code]: ?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=" + . ;[/code] Еще можно поиграться )
|
|
|
|
Добавлено: Пн май 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
[quote="Alexander"]покажите пример использования структуры catch .. throw.[/quote]
: 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 |
|
|
|
|