【问题标题】:How to initialise an array of objects in Eiffel?如何在 Eiffel 中初始化对象数组?
【发布时间】:2022-04-04 03:53:59
【问题描述】:

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

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

但是当我尝试访问数组的其中一个组件(如p.at(i).somefeature())中的功​​能时,它会给出一个运行时异常,说Feature call on void target

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

我认为问题的发生是因为作为引用类型的数组的各个组件(在本例中为生产者或消费者)被初始化为 void。建议的解决方案是使用make_filled(default_value:T;low,high:INTEGER;),其中T 是复杂类型。以字符串数组为例

string_list : ARRAY[STRING]
string_list.make_filled(" ", low, high)

导致string_list 的每个元素被初始化为一个空白字符串。关于如何为PRODUCER 类提供默认值的任何帮助?谢谢

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

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

【问题讨论】:

    标签: eiffel


    【解决方案1】:

    {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.
    >>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-21
      • 2016-03-11
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多