我正在尝试使用Eiffel实现Producer-Consumer问题的解决方案。我有一个类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 target上调用功能”。
关于如何解决这个问题的任何想法?是因为我没有为数组的各个组件调用创建过程吗?或者是否存在创建阵列的方法的基本缺陷?感谢。
我认为问题出现是因为作为引用类型的数组的单个组件(在本例中是生产者或使用者)被初始化为void。建议的解决方案是使用make_filled(default_value:T; low,high:INTEGER;),其中T是复杂类型。给出了字符串数组的一个例子 string_list:ARRAY [字符串] string_list.make_filled(“”,low,high) 使string_list的每个元素初始化为一个空格的字符串。有关如何为类PRODUCER提供默认值的任何帮助?感谢
我想我找到了问题的解决方案。我只需要创建一个PRODUCER和CONSUMER的实例,并使用make_filled中的默认值。然后我可以操纵p [i]和c [i]。
这不是一种超级有效的方法,所以如果有更好的解决方案,请分享。感谢。
答案 0 :(得分: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.
>>