Мне никогда особо не нравился Embedded MATLAB именно из-за ситуаций, подобных тому, о чем я собираюсь спросить :) По моему опыту, преобразование в Embedded MATLAB часто требует гораздо больше усилий, чем простое переписывание на C (когда вы знаете C и API MATLAB достаточно хорошо).
Но да ладно, я думаю, некоторых вещей просто нельзя избежать.
Во всяком случае, вот моя проблема. В Embedded MATLAB, как и в R2010a, вы не можете сделать это:
for ii = <some range>
parameter = <some string>
switch parameter
case 'first_string'
% do stuff
case 'another_string_that''s_larger_than_first_string'
% do other stuff
end
% ...continue here
end
где <some string>
меняется каждую итерацию. Это связано с тем, что длина строки parameter
является переменной, а это означает, что это определение parameter
выходит за рамки возможностей Embedded Matlab:
??? Непостоянное выражение или пустая матрица. Это выражение должно быть постоянным, поскольку его значение определяет размер или класс некоторого выражения. Ограничение на постоянные строки применяется только к переключателям строк, а не к числам.
Изменение switch
на его более прямую форму
switch <some string>
...
end
не помогает конечно:
??? Expected a numeric value. Found a mxArray
Даже ограничение размера строки известной постоянной длиной не помогает:
parameter = char_array(ii, 1:4); % <--- NOTE: length is 4 characters
switch parameter
...
end
но не повезло:
??? Непостоянное выражение или пустая матрица. Это выражение должно быть постоянным, поскольку его значение определяет размер или класс некоторого выражения. Ограничение на постоянные строки применяется только к переключателям строк, а не к числам.
Я вижу два выхода:
- Сопоставьте все допустимые строки с некоторым числовым представлением и используйте переключатель на числах
- Используйте
strcmp(i)
внутри огромной конструкцииif-elseif-elseif-...-else-end
.
Оба одинаково уродливы, ИМХО, причем 2., возможно, уродливее (вам понадобится еще одна внешняя функция, strcmp
)...
Итак, есть ли из этого какой-нибудь элегантный выход?