2

我正在尝试使用 Eiffel 实现生产者-消费者问题的解决方案。我有一个 PRODUCER 类的数组 p 和一个 CONSUMER 类的数组 c 声明和初始化如下:

    local
        p:attached ARRAY[PRODUCER]
        c:attached ARRAY[CONSUMER]
    do
        !!p.make(1,5)
        !!c.make(1,5)

但是,当我尝试访问数组的其中一个组件(如 p.at(i).somefeature())中的功能时,它会给出一个运行时异常,说“对 void 目标的功能调用”。

关于如何解决这个问题的任何想法?是因为我没有为数组的各个组件调用创建过程吗?或者创建数组的方法是否存在基本缺陷?谢谢。

我认为问题的发生是因为作为引用类型的数组的各个组件(在本例中为生产者或消费者)被初始化为 void。建议的解决方案是使用 make_filled(default_value:T;low,high:INTEGER;),其中 T 是复杂类型。字符串数组的示例为 string_list:ARRAY[STRING] string_list.make_filled(" ",low,high) 导致 string_list 的每个元素被初始化为一个空白字符串。有关如何为类 PRODUCER 提供默认值的任何帮助?谢谢

我想我找到了解决问题的办法。我只需要创建一个 PRODUCER 和 CONSUMER 的实例,并在 make_filled 中使用它们的默认值。然后我可以操纵 p[i] 和 c[i]。

这不是一个超级有效的方法,所以如果有更好的解决方案,请分享。谢谢。

4

1 回答 1

2

{ARRAY}.make_filled通常在数组的所有元素都应该相同时使用。如果元素不同,可以将数组一一填充:

create p.make_empty
p.force (create {PRODUCER}.make ("producer 1"), 1) -- Use appropriate code to
p.force (create {PRODUCER}.make ("producer 2"), 2) -- create PRODUCER objects.
...

还有一种创建数组的语法有些过时,因此必须小心使用:

p := <<
    create {PRODUCER}.make ("producer 1"), -- Or some other code
    create {PRODUCER}.make ("producer 2")  -- to create producers.
>>
于 2011-05-09T15:42:59.037 回答