如何在 BCPL 中初始化数组的数组?

问题描述 投票:0回答:2

我尝试了

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

arrays initialization bcpl
2个回答
3
投票

let
关键字仅用于创建new局部变量(也可以是函数,也可能是其他东西,但这与您的问题并不真正相关)。所以,声明:

let stringArr = newvec(12)

在创建新变量时有效

stringArr
,或更准确地说:

  • 某处有一个 12 细胞匿名向量;和
  • stringArr
    变量保存该向量的 address

但是:

let stringArr!i = newvec(5)

not 有效,因为

stringArr!i
实际上不是 new 变量。它只是已经存在的
i
向量中单元格号
stringArr
的内存内容。

换句话说,声明:

let stringArr = newvec(12)

创建初始指针单元格第二层指针,后者还不会指向任何有用的地方:

+-----------+    +-------------+
| stringArr | -> | stringArr!0 | -> ?
+-----------+    +-------------+
                 | stringArr!1 | -> ?
                 +-------------+
                 :      :      :
                 +-------------+
                 | stringArr!N | -> ?
                 +-------------+

而且,由于那些第二层指针已经存在,你不应该使用

let
来设置它们(a)。实现您想要实现的目标的正确方法是:

let stringArr = newvec(12)   // Create new vector AND variable,
                             //   set variable to point at vector.
stringArr!i := newvec(5)     // Create new vector, set existing
                                  cell to point at it.

(a) 这与 C 语言类似,你不会写:

int xyzzy[10];      // Make ten-element array.
int xyzzy[0] = 42;  // Set first element of array.

在这种情况下,第二行不应定义 new 变量,而其目的只是将 existing 元素之一设置为给定值。它应该是:

int xyzzy[10];  // Make ten-element array.
xyzzy[0] = 42;  // Set first element of array.

0
投票

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

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

约翰·布特兰

© www.soinside.com 2019 - 2024. All rights reserved.