如何在 BCPL 中初始化数组数组?
How do I initialize an array of arrays in BCPL?
我尝试了 let stringArr = newvec(12);
然后尝试初始化数组中的每个点:let stringArr!i = newvec(5);
但是 returns 一个错误告诉我我不能这样做。这里有人可以帮助我学习这种恐龙语言吗?
你有点牵强了我的记忆(大约三十年的程度),但我似乎记得 let
仅用于创建 new local变量(还有函数和其他可能的东西,但这与你的问题并不相关)。
因此语句 let stringArr = newvec(12)
在创建新变量 stringArr
时有效,或者更准确地说,创建一个 12 单元匿名向量和 stringArr
变量保存 地址那个向量。
但是,let stringArr!i = newvec(5)
不是 有效的,因为 stringArr!i
实际上不是一个新变量。它只是已经存在的 stringArr
向量中单元格编号 i
的内存内容。
换句话说,语句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.
因为第二行不应该定义 new 变量,而它的目的只是设置 existing 之一] 元素到给定值,用 xyzzy[0] = 42
.
完成
因此,正确的方法是在 BCPL 中避免使用 let
第二个 class 关键字陈述:
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.
解决方案很合理,但我的两个 BCPL 版本(Martin Richard 和 Robert Nordier 的 obcpl)都抱怨 newvec() 并且在第二行中还需要 := 而不是 =。我得到它的工作:
let stringArr = getvec(12)
stringArr!i := getvec(12)
约翰·布特兰
我尝试了 let stringArr = newvec(12);
然后尝试初始化数组中的每个点:let stringArr!i = newvec(5);
但是 returns 一个错误告诉我我不能这样做。这里有人可以帮助我学习这种恐龙语言吗?
你有点牵强了我的记忆(大约三十年的程度),但我似乎记得 let
仅用于创建 new local变量(还有函数和其他可能的东西,但这与你的问题并不相关)。
因此语句 let stringArr = newvec(12)
在创建新变量 stringArr
时有效,或者更准确地说,创建一个 12 单元匿名向量和 stringArr
变量保存 地址那个向量。
但是,let stringArr!i = newvec(5)
不是 有效的,因为 stringArr!i
实际上不是一个新变量。它只是已经存在的 stringArr
向量中单元格编号 i
的内存内容。
换句话说,语句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.
因为第二行不应该定义 new 变量,而它的目的只是设置 existing 之一] 元素到给定值,用 xyzzy[0] = 42
.
因此,正确的方法是在 BCPL 中避免使用 let
第二个 class 关键字陈述:
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.
解决方案很合理,但我的两个 BCPL 版本(Martin Richard 和 Robert Nordier 的 obcpl)都抱怨 newvec() 并且在第二行中还需要 := 而不是 =。我得到它的工作:
let stringArr = getvec(12)
stringArr!i := getvec(12)
约翰·布特兰