Main Content

coder.ceval の出力タイプが不明

問題

次のエラー メッセージが表示されます。

'coder.ceval' の出力に不明なタイプがあります。囲まれ
ている式は評価できません。'coder.ceval' の出力を、既知
のタイプをもつ変数に割り当てることで、出力タイプを指定して
ください。

原因

このエラー メッセージは、コード ジェネレーターが coder.ceval 呼び出しの出力タイプを判別できない場合に発生します。

解決法

一時変数を予想される出力タイプで初期化します。この変数に coder.ceval の出力を代入します。

cFunctionThatReturnsDouble という C 関数があるとします。関数 foo の C ライブラリ コードを生成します。コード ジェネレーターは 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

関数 foo の C ライブラリ コードを生成する場合、コード ジェネレーターはエラー メッセージを生成します。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

参考

|