dc unix:同じ配列インデックスに新しい値を保存しても初期値を保持します。

dc unix:同じ配列インデックスに新しい値を保存しても初期値を保持します。

マンページに提供されている例は理解できませんdc

$ dc  
 1 0:a 0Sa 2 0:a La 0;ap  
 1  

私にとっては、次の理由で答えは2でなければなりません。

  1. 1 0:a
    ここでは、配列の0番目の位置に1を格納しますa

  2. 0Sa
    これでレジスタスタックに0をプッシュしますa

  3. 2 0:a これで、配列のゼロ位置に2を再保存し、aその位置に保存されている古い1を上書きします。

  4. La
    次に、レジスタスタックに保存されているゼロをポップし、aそれをメインスタックにプッシュします。

  5. 0;a
    0をメインスタックにプッシュし、それをポップして配列インデックスとして使用するので、配列のゼロ位置に格納されている2をaメインスタックにプッシュします。

  6. p
    次に、メインスタックの一番上の2を印刷します。したがって、答えは2でなければなりません。

私は何を見逃していますか?

PS - ラベルとして使用したいがdc存在しないようで、そのラベルdebian(マイワークステーションOS)として使用されるラベルを少なくとも1つ使用する必要があります。

ベストアンサー1

配列とスタックを混合するのと同じです。この例では、レジスタはa配列とスタックの両方として使用されます。

1 0:a 
0 Sa 
2 0:a 
La 
0;a p
  1. 最初:a- 登録考慮大量に
  2. その後Sa- 登録スタックとして扱われます。効果的に配列を最初のポイントから下にスライドさせます。新しい大量に。のようにmanレジスタの各スタックインスタンスには独自の連想配列があります。
  3. その後:a- 登録考慮大量に。前の値と最初の配列値を下にスライドさせます。
  4. その後La- 登録考慮。拳を握る累積配列a[0]=2配列なので廃棄してください。
  5. その後;a- 登録考慮大量に。これで1つの値だけが残り、最初の配列値が追加されます。これは1

回答の下部にある例をご覧ください。


コメントによると:

« レジスタごとにいくつのアレイとスタックがありますか?私はレジスタのためのスタックとは別の配列があると思いました。 »

スタック:

スタック入力はdcプッシュダウンスタックまたはLIFO(後入選出)です。レストランの皿と同じです。

      ,------ pop / push - take / leave 
    /
   |
   v
[-----] top
[-----]           ...                 ...                .
[-----]          [-----]             [-----]            ..
 (main)        (register-a)        (register-b)        ...

私たちは基本スタックまたは働くレジスタが必要なジョブが指定されていない場合、スタックが使用されます。各レジスタには独自のスタックがあります。

基本的な登録するタスク:

  • Sr:人気のあるもの価値は次から来る基本スタックとプッシュそれはレジスタで指定されたスタックに移動しますr。両方のスタックが修正されました。
  • Lr:人気のあるものrおよびで指定されたレジスタスタックの値プッシュ到着する基本山。両方のスタックが修正されました。
  • sr:人気のあるもの価値は次から来る基本スタックと書く登録できますr。実際には、レジスタで指定されたスタックの最高値を変更しますr。スタックに値がない場合は追加します。基本スタックが修正されました。レジスタスタック変更された値の横に残ります。
  • lr:読むレジスタの値ですr。実際に複数の値がある場合は、最上位の値になります。基本変更されました。レジスタスタック保存してください。
  • :r:ポップアップが2つあります。価値は以下から来ています。基本スタックを積み重ね、最初の(上部)をインデックスとして使用して、配列の2番目の値をレジスタに保存しますr基本変更されました。レジスタスタック保存してください。
  • ;r:人気のあるもの価値は次から来る基本スタックに格納し、それを指定されたレジスタの現在の配列から読み取った位置へのインデックスとして使用しますr基本変更されました。レジスタスタック保存してください。

スタックとアレイが一緒に混在する

観察する1つの方法はペアリングすることです。起動すると、すべてのレジスタが空になります。スタックに要素を追加するSr隠れるこのスタックのすべての基本要素です。次のようにすると仮定してください。

1 Sx
2 Sx
4 Sx

x = (S)  4     VISIBLE
    (S)  2     HIDDEN
    (S)  1     HIDDEN

今できる変化レジスタの値Xつまり、最上位要素を変更すると、スタック内の要素数を変更せずにsx読み取ることができます。lx

lx p  # Read value in register x - in effect read topmost element from stack.
4     # Printed value by p.
3 sx  # Change value in register x - in effect change topmost element in stack.

x = (S)  3     VISIBLE
    (S)  2     HIDDEN
    (S)  1     HIDDEN

配列要素を追加することを決定すると、状況がより複雑になり始めます。

4 1:x
5 2:x
    
x = [A] 
        [2]=5  VISIBLE
        [1]=4  VISIBLE
    (S)  3     VISIBLE
    (S)  2     HIDDEN
    (S)  1     HIDDEN

今私たちは現在のスタックに配列。何でも読んで修正できます見える要素

44 1:x
55 2:x
33 sx

1;x p # Read and print index 1
44

lx p  # Read and print stack top.
33

x = [A] 
        [2]=55  VISIBLE
        [1]=44  VISIBLE
    (S)  33     VISIBLE
    (S)  2      HIDDEN
    (S)  1      HIDDEN

もしそうなら、次へ追加要素を積み重ねる1つの方法は次のとおりです。スタックフレーム上記の配列にすでに値を追加しているため、拡張できません。したがって、新しいスタックフレーム追加されました。

6 Sx
7 Sx

x = (S)  7      VISIBLE
    (S)  6      HIDDEN
    [A] 
        [2]=55  HIDDEN
        [1]=44  HIDDEN
    (S)  33     HIDDEN
    (S)  2      HIDDEN
    (S)  1      HIDDEN

今アクセスしようとすると最後配列が隠されています。効果的に空の配列を読み取り、結果はデフォルト値です0。レジスタ値を変更できます7ですsrが、上記の2つのスタック要素を削除しないと、2つのレベルより下の配列にアクセスできません。

いくつかの配列要素を追加することを決定すると、最上位のスタック要素を持つ新しい配列(ペアの配列として)に追加されます。

8 1:x
9 2:x

x = [A]
        [2]=9   VISIBLE
        [1]=8   VISIBLE
    (S)  7      VISIBLE
    (S)  6      HIDDEN
    [A] 
        [2]=55  HIDDEN
        [1]=44  HIDDEN
    (S)  33     HIDDEN
    (S)  2      HIDDEN
    (S)  1      HIDDEN

私たちが作ったらポップミュージック私たちが爆発したスタック7でも配列があるから〜サイ(いわば)それも削除されました。

Lx p  # Pop + print top stack element.
7     # Value printed.

x = (S)  6      VISIBLE
    [A] 
        [2]=55  HIDDEN
        [1]=44  HIDDEN
    (S)  33     HIDDEN
    (S)  2      HIDDEN
    (S)  1      HIDDEN

配列対8そして9左。値を持つスタック要素6表示されます。しかし、デフォルトの配列はブロックされました。1;x p歩留まりで読む0

ある意味では、配列が不透明である間にスタック要素がブロックされていると言えます。配列は少し似ています。にぶら下がってスタック要素に。

私たちがしなければならないことがもう1つあります。ポップミュージック~からデフォルトのスタック要素+配列を表示します。

Lx p  # Pop + print top stack element.
6     # Value printed.

x = [A] 
        [2]=55  VISIBLE
        [1]=44  VISIBLE
    (S)  33     VISIBLE
    (S)  2      HIDDEN
    (S)  1      HIDDEN

結論として、アレイとスタックの数はレジスタごとに1つに限定されないと言えます。

各レジスタにはいくつのアレイとスタックがありますか?
- このレジスタで実行される代替合計Sr演算の数によって異なります。:r

もう一つの観点では、スタックは1つだけですが、配列は複数あります。そして、もし配列要素を追加する間にスタック要素を追加します。

特定の瞬間に現在の配列がそうでないと言う別の方法があります。

[register][array]

しかし、

[register][stack-element][array]

これは作る:

[register][stack-element][array][...]
[register][stack-element][array][1]
[register][stack-element][array][0]

そしてそのstack-elementセクションは不透明で読み取り専用です。ただし、この場合はスタック要素の値が必要ないことも覚えておく必要があります。レジスタに配列値を追加するだけです。

または、各スタック要素は、変更可能なゼロで埋められた配列とペアになります。

1 Sx
2 Sx
3 Sx
4 1:x
5 2:x
6 Sx
7 Sx
8 1:x
9 2:x

x = (S)  7   +   A[0]=0   A[1]=8   A[2]=9   A[3]=0  ...  A[2048]=0
    (S)  6   +   A[0]=0             ...                  A[2048]=0
    (S) 33   +   A[0]=0   A[1]=4   A[2]=5   A[3]=0  ...  A[2048]=0
    (S)  2   +   A[0]=0             ...                  A[2048]=0
    (S)  1   +   A[0]=0             ...                  A[2048]=0

もう少し明確になりますように。


いくつかの例


$ dc
[ein]  0:a
[zwei] Sa
[drei] 0:a

0;ap   # Copy + print index 0 of topmost array in register a
drei

Lap    # Throws away [drei] and pops+prints first element in stack*
zwei

0;ap   # Copy + print index 0 of first array 
ein

$ dc
[uno]    0:a  # Array a(1)
[dos]    1:a  # Array a(1)
[tres]   2:a  # Array a(1)

[cuatro] Sa   # Array a(2)
[cinco]  Sa   # Array a(2)
[seis]   Sa   # Array a(2)

[siete]  0:a  # Array a(3)
[ocho]   1:a  # Array a(3)
[nueve]  2:a  # Array a(3)

Laf      # Throws away Array 3 to get to first stack array, Array 2.
seis

Laf
cinco
seis

Laf
cuatro
cinco
seis

2;af      # Now we're at the first array, Array 1.
tres
cuatro
cinco
seis

1;af
dos
tres
cuatro
cinco
seis

0;af
uno
dos
tres
cuatro
cinco
seis

おすすめ記事