我从不太喜欢嵌入式 MATLAB,正是因为我将要问的情况 :) 根据我的经验,转换到嵌入式 MATLAB 通常比简单地用 C 重写东西要付出更多的努力(当你知道 C 和MATLAB API 足够好)。
但是哦,好吧,我想有些事情是无法避免的。
无论如何,这是我的问题。在嵌入式 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
where<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
)......
那么,有什么优雅的方法可以解决这个问题吗?