0

所以我有一个教堂问题,我似乎无法弄清楚。我有一个可以设置大小的队列。唯一的问题是它正在设置大小并用一堆 0 填充队列(这是有道理的)。我试图用空值而不是数值填充队列,所以稍后当我处理 add 方法时,我可以检查队列是否为空。我附上了一张图片,说明一切是如何设置的。让我知道你们是否有任何指导或想法。我得到的错误是:

错误:从字符串到 int(64) 的赋值类型不匹配

我一定是在这里做错了。

在此处输入图像描述

4

1 回答 1

4

您看到的错误与该行有关:

elements[i] = 'nil';

'nil'是一个字符串,而不是 nil 值,它被写成nil没有任何引号。将字符串分配给 int(64) 数组中的插槽不起作用,因此编译器会发出错误。

但是,在 Chapel 中,只有类可以具有 nil 值,因此您需要使用不同的方式来跟踪elements数组中的哪些位置被填充。

一种方法是向您的类添加两个新整数,以跟踪包含有效值的第一个和最后一个位置。当您向队列添加值时,last位置会增加,而当您删除值时,first位置会增加。当这些值中的任何一个通过数组的末尾时,它就会回到前面。如果有last捕获first,则数组已满。如果有first捕获last,则数组为空。

我认为应该在您的代码中更正的其他一些事情是:

  • use semaphore.chpl;使用语句适用于模块名称,而不是文件名,所以这应该是use semaphore;.

  • 如果我在这里理解您的意图,则此代码正在尝试将elements数组的大小设置为 5。

    var elementsDomain: domain(1);
    var elements: [elementsDomain] eltType = 5;
    

    数组的域控制着数组的大小,所以设置数组大小的方式是通过域:

    var elementsDomain: domain(1) = {0..#5};
    var elements: [elementsDomain] eltType;
    
  • elementsDomain = (0..capacity - 1);设置elementsDomain为范围文字值。这是有效的,因为域是一维的,但为了更清楚,您可以将其设置为域文字值:{0..capacity - 1}.

于 2017-04-16T03:17:08.727 回答