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