Неизвестный Выходной Тип для 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

Чтобы зафиксировать ошибку, инициализируйте временную переменную с известным типом. В данном примере используйте тип скаляра дважды.

function foo
%#codegen
obj = classWithSetter;
temp = 0;
temp = coder.ceval('cFunctionThatReturnsDouble'); 
obj.expectedResult = temp; 
end

Смотрите также

|