2

私はEiffelを使用して生産者/消費者問題の解決策を実装しようとしています。クラスPRODUCERの配列pとクラスCONSUMERの配列cが次のように宣言され、初期化されています。

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

しかし、配列のコンポーネントの1つ(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通常、配列のすべての要素が同じである必要がある場合に使用されます。要素が異なる場合、配列を 1 つずつ埋めることができます。

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 に答える