Я пытаюсь реализовать решение проблемы «производитель-потребитель» с помощью Eiffel.У меня есть массив p класса PRODUCER и массив c класса CONSUMER, объявленный и инициализированный следующим образом:
local
p:attached ARRAY[PRODUCER]
c:attached ARRAY[CONSUMER]
do
!!p.make(1,5)
!!c.make(1,5)
Но когда я пытаюсь получить доступ к функции в одном из компонентов массива (например, p.в (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].
Это не очень эффективный способ, поэтому, если есть лучшее решение, пожалуйста, поделитесь им.Спасибо.