我尝试了 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/