我目前正在使用mex函数,其中整数作为参数发送,首先将其转换为int
类型:
a = int32(10);
foo(a);
foo通过使用:
接收/检查a
void get_integer_scalar(int &scalar,const mxArray *mat_buf) {
// Check input
if (mxIsClass(mat_buf,"int32")) {
if (mxGetN(mat_buf) == 1 && mxGetM(mat_buf) == 1) {
// At this point, input is correct
scalar = *((int *)mxGetData(mat_buf));
} else {
mexErrMsgTxt("Integer scalar is not of size == [1 1].\n");
}
} else {
mexErrMsgTxt("Integer scalar is not int32.\n");
}
}
现在,我突然意识到int
类型与机器有关,因此行scalar = *((int *)mxGetData(mat_buf));
可能不安全(或者是它?我试图不做假设关于int32()
如何在matlab中工作)。有没有一种安全的方法可以将标准int
类型传递给mex文件,还是应该使用像int32_t
这样的32位整数类型?
答案 0 :(得分:4)
使用mxGetScalar
,无论输入类型是什么,都会返回一个double值,无需担心。
double mxGetScalar(const mxArray *pm); // the type of data in pm doesn't matter
在C中,
mxGetScalar
返回一个双精度数。如果mxArray
中的真实元素属于double
以外的类型,mxGetScalar
会自动将标量值转换为double
。要保留标量的原始数据表示形式,请将返回值强制转换为所需的数据类型。
只需检查元素数量,您甚至不需要进行类型检查(但如果需要,我会使用mxIsInt32
):
#include <mex.h>
void get_integer_scalar(int &scalar,const mxArray *mat_buf) {
// Check input
if (!mxIsInt32(mat_buf))
mexPrintf("Integer scalar is not int32, but that's OK.\n");
if (mxGetNumberOfElements(mat_buf) == 1) {
scalar = mxGetScalar(mat_buf);
} else {
mexErrMsgTxt("Integer scalar is not of size == [1 1].\n");
}
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int val;
if (nrhs>0)
{
get_integer_scalar(val,prhs[0]); // type of prhs[0] does not matter
mexPrintf("%d\n",val);
}
}
要回答你的问题,MATLAB的int32
显然不依赖于机器,但正如你所指出的那样,不能保证C ++ int
将是32位的。我认为mxGetScalar
解决了这个问题,但是对于数组(当你需要安全地投射指针时)我认为你可以使用<stdint.h>
或<cstdint>
来设置{{1 }},int8_t
,int16_t
,int32_t
等.Visual Studio会int64_t
。
MATLAB还有一个标题用于此目的:typedef int int32_t;
。它设置以下固定宽度类型:
tmwtypes.h
以下是/*=======================================================================*
* Fixed width word size data types: *
* int8_T, int16_T, int32_T - signed 8, 16, or 32 bit integers *
* uint8_T, uint16_T, uint32_T - unsigned 8, 16, or 32 bit integers *
* real32_T, real64_T - 32 and 64 bit floating point numbers *
*=======================================================================*/
的相关内容:
int32_T
通过将#ifndef INT32_T
# if TMW_BITS_PER_INT == 32
# define INT32_T int
# elif TMW_BITS_PER_LONG == 32
# define INT32_T long
# elif TMW_BITS_PER_SCHAR == 32
# define INT32_T signed char
# elif TMW_BITS_PER_SHRT == 32
# define INT32_T short
# endif
#endif
#ifdef INT32_T
typedef INT32_T int32_T;
#endif
与各种十六进制文字进行比较,标题中的TMW_BITS_PER_INT
得到INT_MAX
,0x7FFFFFFFL
胜出。 基本上,如果您要int32_T
,则可以tmwtypes.h
中所述使用int
。
但是,我怀疑MATLAB支持使用除{{1}}的32位无符号整数之外的任何工具集。