エラーの解決: データ型の不一致
問題
この例では、y は SumMode
プロパティの場合に既定の fimath
設定の FullPrecision
を使用します。関数 mysum
内の for ループの反復ごとに、y の語長は 1 ビットずつ増加します。
シミュレーション中でも、MATLAB® ではデータ型が容易に変更できるので、問題は発生しません。ただし、C ではデータ型は静的なままでなければならないので、ビルド時にデータ型不一致のエラーが発生します。
考えられる解決策
for ループ内で添字による代入を使用するように関数を書き換えます。
この例では、y = y + x(n) を y(:) = y + x(n) と書き換え、右辺の値が y のデータ型に代入されるようにしています。この代入では、y の numerictype
が維持されるため、データ型不一致エラーが発生しません。
元のアルゴリズム | 新しいアルゴリズム |
---|---|
関数: function y = mysum(x,T) %#codegen y = zeros(size(x), 'like', T.y); for n = 1:length(x) y = y + x(n); end end | 関数: function y = mysum(x,T) %#codegen y = zeros(size(x), 'like', T.y); for n = 1:length(x) y(:) = y + x(n); end end |
型テーブル: function T = mytypes(dt) switch(dt) case 'fixed' F = fimath('RoundingMethod', 'Floor') T.x = fi([],1,16,11, F); T.y = fi([],1,16,6, F); end end | 型テーブル: function T = mytypes(dt) switch(dt) case 'fixed' F = fimath('RoundingMethod', 'Floor') T.x = fi([],1,16,11, F); T.y = fi([],1,16,6, F); end end |