2

したがって、これは以前にFORTHを使用したことがある人にとっては簡単な質問ですが、私はこの言語のコーディング方法を学ぼうとしている初心者です(これは、C ++とは大きく異なります)。

とにかく、私はFORTHで「Height」という変数を作成しようとしているだけで、特定の単語「setHeight」が呼び出されるたびにユーザーが「Height」の値を入力できるようにしたいと考えています。ただし、変数の設定方法やユーザー入力を取得して変数に入れる方法がわからないため、私が試したすべてが失敗しているようです。

    VARIABLE Height 5 ALLOT
    : setHeight 5 ACCEPT ATOI CR ;

これが簡単に修正できる問題であることを願っています。助けていただければ幸いです。前もって感謝します。

4

2 に答える 2

3

FORTH での文字列または数値入力のRosettacode入力/出力の例を見てみましょう。

文字列入力

: INPUT$ ( n -- addr n )
   PAD SWAP ACCEPT
   PAD SWAP ;

数値入力

: INPUT# ( -- u true | false )
  0. 16 INPUT$ DUP >R
  >NUMBER NIP NIP 
  R> <> DUP 0= IF NIP THEN ;
于 2013-02-03T09:00:14.847 に答える
0

自己啓発のために覚えておくべき重要なポイント - C++ はかなり型キャストされていますが、Forth は完全に反対です。高さを文字列、整数、または浮動小数点のどれにするか、また符号付きか符号なしか? それぞれに独自のユースケースがあります。どちらを選択する場合でも、選択したタイプを念頭に置いて Height 変数を操作する必要があります。毎回ビットが何を意味するかを考えてください。

あなたの ATOI 呼び出しから判断すると、Height の値を整数として欲しいと思います。ただし、5 バイトの整数は珍しいので、まだ確信が持てません。しかし、ここではその仮定に当てはまります。

VARIABLE Height 1 CELLS ALLOT
VARIABLE StrBuffer 7 ALLOT

: setHeight ( -- )
  StrBuffer 8 ACCEPT
  DECIMAL ATOI Height ! ;

CELLS 呼び出しは、CPU が好むビット数で変数を作成していることを確認します。DECIMAL 呼び出しは、ATOI の前の途中で HEX に変更していないことを確認します。

StrBuffer 変数を作成することは、文字列用のスクラッチ スペースを取得する多くの方法の 1 つです。CELL が 16 ビットであると仮定すると、「-32767\0」のように、ゼロで終わる 16 ビットの符号付き整数に最大 7 文字が必要になります。一部の実装には、独自のバッファーを作成する代わりに使用できる PAD があります。もう 1 つの一般的な言葉は SCRATCH ですが、それは私たちが望むようには機能しないと思います。

独自の文字列バッファー スペースを作成することに固執する場合 (私が個人的に気に入っているのは、どのくらいのスペースが得られたかを正確に把握しているからです)、すべての単語の文字列処理のニーズに対して 1 つの大きなバッファーを作成することを検討してください。例えば:

VARIABLE StrBuffer 201 ALLOT

これにより、200 文字で 64 ビットの符号付き整数に簡単に対応できるため、16 ビットの CELL を仮定する必要がなくなります。これは、現在または将来の実装の CELL サイズである場合に備えてです。

于 2013-03-22T22:55:08.113 に答える