我正在尝试使用 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]。
这不是一个超级有效的方法,所以如果有更好的解决方案,请分享。谢谢。