Si potrebbe anche chiamare il runtime C sprintf
o snprintf
usando coder.ceval
. Questo ha il vantaggio di rendere facile anche il supporto degli ingressi in virgola mobile. È inoltre possibile modificare la formattazione come desiderato modificando la stringa di formato.
Supponendo che il compilatore fornisce snprintf
si potrebbe usare:
function s = cint2str(x)
%#codegen
if coder.target('MATLAB')
s = int2str(x);
else
coder.cinclude('<stdio.h>');
assert(isfloat(x) || isinteger(x), 'x must be a float or an integer');
assert(x == floor(x) && isfinite(x), 'x must be a finite integer value');
if isinteger(x)
switch class(x)
% Set up for Win64, change to match your target
case {'int8','int16','int32'}
fmt = '%d';
case 'int64'
fmt = '%lld';
case {'uint8','uint16','uint32'}
fmt = '%u';
otherwise
fmt = '%llu';
end
else
fmt = '%.0f';
end
% NULL-terminate for C
cfmt = [fmt, 0];
% Set up external C types
nt = coder.opaque('int','0');
szt = coder.opaque('size_t','0');
NULL = coder.opaque('char*','NULL');
% Query length
nt = coder.ceval('snprintf',NULL,szt,coder.rref(cfmt),x);
n = cast(nt,'int32');
ns = n+1; % +1 for trailing null
% Allocate and format
s = coder.nullcopy(blanks(ns));
nt = coder.ceval('snprintf',coder.ref(s),cast(ns,'like',szt),coder.rref(cfmt),x);
assert(cast(nt,'int32') == n, 'Failed to format string');
end
Nota che avrete probabilmente bisogno di modificare la stringa di formato per abbinare l'hardware su cui si sta eseguendo dal momento che questo presuppone che long long
è disponibile e mappa ad esso interi a 64 bit.
fonte
2015-07-24 12:48:16
È supportato 'num2str'? È la funzione più generale di questo tipo. – buzjwa
num2str purtroppo non è supportato. – ein123