我尝试了 let stringArr = newvec(12);,然后尝试将数组中的每个点初始化为:let stringArr!i = newvec(5); 但这会返回一个错误,告诉我我不能这样做。这里有人可以帮我学习这种恐龙语言吗?

最佳答案

你有点拉伸(stretch)我的内存(大约三年的程度),但我似乎记得 let 仅用于创建新的局部变量(还有函数和其他可能的东西,但这与你的问题并不真正相关)。
所以语句 let stringArr = newvec(12) 在创建新变量 stringArr 或更准确地说,一个 12 单元的匿名向量和保存该向量地址的 stringArr 变量时有效。
但是, let stringArr!i = newvec(5) 无效,因为 stringArr!i 实际上并不是一个新变量。它只是已经存在的 i 向量中单元号 stringArr 的内存内容。
换句话说, let stringArr = newvec(12) 语句创建了初始指针单元和第二层指针,它们不会指向任何有用的地方:

+-----------+
| 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.
因为第二行不应该定义一个新变量,它的意图只是将现有元素之一设置为给定值,使用 xyzzy[0] = 42 完成。

因此,在 BCPL 中尝试实现的正确方法是避免对第二类语句使用 let 关键字:
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.

关于arrays - 如何在 BCPL 中初始化数组数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29480073/

10-12 04:57