Har*_*Har 10 c matlab types mex 32bit-64bit
我目前正在努力将一些C文件移植到64位Matlab,这些文件是用32位Matlab进行的.
在这样做时,我遇到了两种类型,一种来自Matlab人,一种来自C标准.
这是Matlab文档中关于mwSize的内容:
mwSize(C和Fortran)
输入大小值
描述
mwSize是一种表示大小值的类型,例如数组维度.使用此功能可实现跨平台灵活性.默认情况下,mwSize等效于C中的int.使用mex -largeArrayDims开关时,mwSize等效于C中的size_t.在Fortran中,mwSize类似于INTEGER*4或INTEGER*8,基于平台和编译标志.
这就是维基百科对size_t的评价:
size_t是由stddef.h中定义的几个C/C++标准(例如,C99 ISO/IEC 9899标准)定义的无符号数据类型.[1] 它可以通过包含stdlib.h进一步导入,因为这个文件内部子包含stddef.h [2].
此类型用于表示对象的大小.采用或返回大小的库函数期望它们属于此类型或返回类型为size_t.此外,最常用的基于编译器的运算符sizeof应该计算为与size_t兼容的值.
size_t的实际类型取决于平台; 一个常见的错误是假设size_t与unsigned int相同,这可能导致编程错误,[3] [4]例如从32位移植到64位架构时.
据我所知,这些类型实际上是相同的.我的问题是:1)是吗?2)如果是,哪一个被认为是更好的编程品味使用.理想情况下,我们希望我们的代码与未来的Matlab版本兼容.我猜测答案是mwSize,但我不确定.
编辑:我应该补充一点,Matlab人正在使用两者.例如,
size_t mxGetN(const mxArray *pm);
Run Code Online (Sandbox Code Playgroud)
是一个检索mxArray列数的函数.但是,当一个人创建矩阵时,人们会使用,
mxArray *mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);
Run Code Online (Sandbox Code Playgroud)
输入显然应该是mwSize.
Pra*_*ian 12
mwSize定义为向后兼容性和可移植性.随着文档状态,将其映射到一个int当-largeArrayDims编译期间,不使用开关,并且size_t当它是.因此,在第一种情况下mwSize签署,但在第二种情况下,它不是.
mwSize在代码中使用允许您在所有平台上重用代码,无论是否使用该标志.
至于您指出的API不一致性,它们确实是不一致的,但不是主要关注的问题.mxGetN()永远不会返回负数,所以让它返回一个size_t是可以的.但是,(我猜测)旧版本或某些平台上的mex API版本需要传递一个int,mxCreateDoubleMatrix()因此将函数定义为采用类型输入mwSize使其可移植和/或向后兼容.
简短的回答是,使用mwSize和-largeArrayDims编译mex函数.
| 归档时间: |
|
| 查看次数: |
3716 次 |
| 最近记录: |