let stringArr = newvec(12);
配列内の各スポットをそのように初期化しようとしましlet stringArr!i = newvec(5);
たが、それができないというエラーが返されます。この恐竜の言語で私を助けてくれる人はいますか?
2 に答える
あなたは私の記憶を少し伸ばしています(約30年程度)が、それは新しいlet
ローカル変数を作成するためだけに使用されたことを思い出しているようです(関数やその他のものも含まれますが、それはあなたの質問にはあまり関係ありません)。
したがって、このステートメントlet stringArr = newvec(12)
は、新しい変数stringArr
、より正確には、12 セルの匿名ベクトルとそのベクトルのアドレスstringArr
を保持する変数を作成する際に有効です。
ただし、実際には新しい変数ではないlet stringArr!i = newvec(5)
ため、有効ではありません。stringArr!i
これは単に、i
既存のstringArr
ベクトルのセル番号のメモリ内容です。
つまり、このステートメントlet stringArr = newvec(12)
は、最初のポインター セルとポインターの 2 番目のレイヤーの両方を作成しますが、まだ有用な場所を指していません。
+-----------+
| stringArr | ---+
+-----------+ | +-------------+
+--> | stringArr!0 | --> ?
+-------------+
| stringArr!1 | --> ?
+-------------+
: : :
+-------------+
| stringArr!N | --> ?
+-------------+
また、ポインターは既に存在するため、それらを設定するために使用するべきではありませんlet
。
次のように記述しないという点で、C と似ています。
int xyzzy[10]; // Make array of ten elements.
int xyzzy[0] = 42; // Set first element to something.
2 行目は新しい変数を定義するものではなく、既存の要素の 1 つを指定された値に設定することを目的としているため、xyzzy[0] = 42
.
したがって、BCPL で達成しようとしていることを行う正しいlet
方法は、ステートメントの 2 番目のクラスにキーワードを使用しないことです。
let stringArr = newvec(12) // Create new vector AND new variable,
// put vector address into cell for
// that variable.
stringArr!i := newvec(5) // Create new vector, put vector
// address into EXISTING cell.