Вы видите это сообщение об ошибке:
Output of 'coder.ceval' has unknown type. The enclosing expression cannot be evaluated. Specify the output type by assigning the output of 'coder.ceval' to a variable with a known type.
Это сообщение об ошибке возникает, когда генератор кода не может определить тип выхода coder.ceval
вызов.
Инициализируйте временную переменную с ожидаемым типом выхода. Назначьте выход из coder.ceval
к этой переменной.
Предположим, что у вас есть функция C, вызываемая cFunctionThatReturnsDouble
. Вы хотите сгенерировать код библиотеки C для функции foo
. Генератор кода возвращает сообщение об ошибке, поскольку оно не может определить тип возврата coder.ceval
.
function foo %#codegen callFunction(coder.ceval('cFunctionThatReturnsDouble')); end function callFunction(~) end
Чтобы исправить ошибку, задайте тип вывода функции C с помощью временной переменной.
function foo %#codegen temp = 0; temp = coder.ceval('cFunctionThatReturnsDouble'); callFunction(temp); end function callFunction(~) end
Вы также можете использовать coder.opaque
для инициализации временной переменной.
Предположим, что у вас есть класс с пользовательским set
способ. Этот класс использует set
метод, чтобы убедиться, что значение свойства объекта находится в определенной области значений.
classdef classWithSetter properties expectedResult = [] end properties(Constant) scalingFactor = 0.001 end methods function obj = set.expectedResult(obj,erIn) if erIn >= 0 && erIn <= 100 erIn = erIn.*obj.scalingFactor; obj.expectedResult = erIn; else obj.expectedResult = NaN; end end end end
При генерации кода библиотеки C для функции foo
генератор кода выдает сообщение об ошибке. Тип входа в set
метод не может быть определен.
function foo %#codegen obj = classWithSetter; obj.expectedResult = coder.ceval('cFunctionThatReturnsDouble'); end
Чтобы исправить ошибку, инициализируйте временную переменную с известным типом. В данном примере используйте тип скаляра double.
function foo %#codegen obj = classWithSetter; temp = 0; temp = coder.ceval('cFunctionThatReturnsDouble'); obj.expectedResult = temp; end