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