【问题标题】:How do I initialize an array of arrays in BCPL?如何在 BCPL 中初始化数组?
【发布时间】:2015-04-06 21:34:37
【问题描述】:

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

【问题讨论】:

  • 哇,BCPL 还在哪里使用?
  • @Barmar 推特。开个玩笑,特定的大学课程。
  • 我在 BCPL 参考手册 cm.bell-labs.com/cm/cs/who/dmr/bcpl.pdf 的任何地方都没有看到 ! 字符
  • 啊,看起来这是 1979 年版的 BCPL,而不是 1967 年版。

标签: arrays initialization bcpl


【解决方案1】:

您稍微延长了我的记忆力(大约三个十年),但我似乎记得 let 仅用于创建 new 局部变量(也包括函数和可能的其他事情,但这与您的问题并不真正相关)。

因此,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 关键字:

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.

【讨论】:

    【解决方案2】:

    解决方案是合理的,但我的两个版本的 BCPL(Martin Richard 和 Robert Nordier 的 obcpl)都抱怨 newvec() 并且在第二行中还需要 := 而不是 =。我得到了它的工作:

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

    约翰·布特兰

    【讨论】:

    • 感谢您的编辑,wogsland。我不知道(并且仍然不知道)如何获取该格式的代码。约翰
    • 约翰,我怀疑您可能在发布此答案后的 3.5 年内就已经弄清楚了 :-) 但是,以防万一,您必须确保代码前有一个空行,并且每行代码以四个空格开头。您可以标记一个文本块,然后使用 CTRL-K 对其进行代码缩进。或者,也有一种三重反引号方法,但我从不使用,因此无法提供建议。
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2019-09-29
    • 2011-09-08
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多