Неизвестный тип выхода для coder.ceval

Проблема

Вы видите это сообщение об ошибке:

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

См. также

|