问题
I am trying to implement a solution to the Producer-Consumer problem using Eiffel. I have an array p of class PRODUCER and an array c of class CONSUMER declared and initialized as following:
local
p:attached ARRAY[PRODUCER]
c:attached ARRAY[CONSUMER]
do
!!p.make(1,5)
!!c.make(1,5)
But when I try to access a feature in one of the components of the array (like p.at(i).somefeature()), it gives a runtime exception saying "Feature call on void target".
Any ideas on how to solve this? Is it because I am not calling a creation procedure for individual components of the array? Or is there a basic flaw in the approach to create the arrays? Thanks.
I figured the problem occurs because the individual components of the arrays (in this case, a producer or a consumer), being a reference type is initialized to void. The solution suggested is to use make_filled(default_value:T;low,high:INTEGER;), where T is the complex type. An example is given for string arrays as string_list:ARRAY[STRING] string_list.make_filled(" ",low,high) causing each element of string_list to be initialized to a string that is a blank space. Any help on how to give a default value for the class PRODUCER? Thanks
I think I figured out the solution to the problem. I just had to create an instance of PRODUCER and CONSUMER and use those in the default value in make_filled. Then I can manipulate p[i] and c[i].
This is nota super efficient way, so if there is a better solution, please do share it. Thanks.
回答1:
{ARRAY}.make_filled
is normally used when all the elements of the array should be the same. If the elements are different, the array can be filled one by one:
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.
...
There is also a somewhat obsolete syntax to create arrays, so it has to be used with care:
p := <<
create {PRODUCER}.make ("producer 1"), -- Or some other code
create {PRODUCER}.make ("producer 2") -- to create producers.
>>
来源:https://stackoverflow.com/questions/5915438/how-to-initialise-an-array-of-objects-in-eiffel