我该如何在BCPL中初始化一个二维数组?

3

我试过let stringArr = newvec(12);,然后尝试像这样初始化数组中的每个位置:let stringArr!i = newvec(5); 但是返回错误告诉我不能这样做。是否有人在场可以帮我解决这个恐龙语言的问题?


1
哇,BCPL 还在使用吗? - Barmar
@Barmar Twitter。开玩笑的,是一门特定的大学课程。 - countofmontecristo
我在BCPL参考手册http://cm.bell-labs.com/cm/cs/who/dmr/bcpl.pdf中没有看到`!`字符。 - Barmar
啊,看起来这是1979年版本的BCPL,而不是1967年的版本。 - Barmar
2个回答

3
你有点考验我的记忆(三十年前的),但我似乎记得let仅用于创建新的局部变量(也包括函数和可能的其他内容,但这与你的问题无关)。
因此,语句let stringArr = newvec(12)在创建新变量stringArr或更精确地说是一个12个单元的匿名向量以及stringArr变量保存该向量的地址方面是有效的。
然而,let stringArr!i = newvec(5)无效的,因为stringArr!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.

0

这个解决方案很好,但是我的两个版本的BCPL(Martin Richard和Robert Nordier的obcpl)都会抱怨newvec(),并且在第二行需要使用:=而不是=。我用以下代码使其正常工作:

let stringArr = getvec(12)
stringArr!i := getvec(12)

约翰·博特兰


感谢您的编辑,wogsland。我不知道(现在仍然不知道)如何以这种格式获取代码。John - John Boutland
约翰,我怀疑自你发布这个答案以来的3.5年里,你可能已经弄清楚了 :-) 但是,以防万一,你必须确保在你的代码之前有一个空行,并且每行代码都以四个空格开头。你可以标记一个文本块,然后使用CTRL-K进行代码缩进。另外,也有一种三重反引号的方法,但我从不使用,所以无法提供建议。 - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接