Matlab/Mex:mxarray.h 中的转换警告

Posted

技术标签:

【中文标题】Matlab/Mex:mxarray.h 中的转换警告【英文标题】:Matlab/Mex: Conversion warning in mxarray.h 【发布时间】:2017-08-24 20:37:10 【问题描述】:

我正在为 Matlab 编写一个 mex 函数,并在编译期间注意到来自 Visual Studio 2017 的警告。在几乎删除了所有内容之后,除了包含和 mex 函数的裸包装,我不得不得出结论,警告实际上是指向库本身:

#include <mexplus/mxarray.h>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])



这个 sn-p 已经触发了警告

...\mexplus\mxarray.h(737): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data

我查看了文件,确实有一个循环在 size_t 中通过 std::vector 进行迭代,同时调用之前定义的函数,该函数将 int 作为参数:

733:  std::vector<std::string> fieldNames() const 
734:    MEXPLUS_ASSERT(isStruct(), "Expected a struct array.");
735:    std::vector<std::string> fields(fieldSize());
736:    for (size_t i = 0; i < fields.size(); ++i)
737:      fields[i] = fieldName(i);
738:    return fields;
739:  

函数fieldName在上面定义:

std::string fieldName(int index) const 
    const char* field = mxGetFieldNameByNumber(array_, index);
    MEXPLUS_ASSERT(field, "Failed to get field name at %d.", index);
    return std::string(field);

所以,由于size_tint 的转换已经在不同的环境中造成了一些混乱,我的问题是:

我可以放心地忽略这个吗? 真的有理由让任何人像这样编写函数fieldNames()(或者更确切地说,要求函数fieldName(int index) 将整数作为参数)? 这个警告可能实际上指向我的配置文件中的错误吗?

【问题讨论】:

【参考方案1】:

您可以放心地忽略这一点。

这里很好地描述了为什么可以这样编写循环 来自http://en.cppreference.com/w/cpp/types/size_t:

std::size_t 通常用于数组索引和循环计数。使用其他类型(例如 unsigned int)进行数组索引的程序可能会失败,例如索引超过 UINT_MAX 或依赖于 32 位模运算时的 64 位系统。

size_t 的实际值(可分配的最大内存量)将取决于系统。编译器似乎将 0(在 i = 0 中)转换为 int,然后抛出警告,因为它只是将您的可用范围减少了一半(即,而不是 unsigned int)。

但在实践中,i 可能仍然可以索引到 2^32 的值(这是它与平台相关的地方),并且您可能不会处理结构有那么多字段名。

这个警告可能实际上指向我的配置文件中的错误吗?

我不这么认为。

我可以放心地忽略这个吗?

是的。

【讨论】:

谢谢你,这回答了我所有的主要问题。还要感谢size_t的引用,因为我时隔很久才回到C++,忘记了它的定义。我只是想知道,为什么 MathWorks 没有继续并定义 fieldName 以采用 size_t 而不是 int。但是可能有一些逻辑,只有在查看其中一个 API 的工作方式时才会显示出来(mxGetFieldNameByNumber 正在调用一个,我从其定义中假设:LIBMMWMATRIX_PUBLISHED_API_EXTERN_C const char *mxGetFieldNameByNumber)。 欢迎您,并进行良好的跟进。我也想知道为什么当size_t 与其他地方的std:: 命名空间引用一致时,他们不将size_t 称为std::size_t。这里可能有一些逻辑,或者它可能只是拥有更大代码库的人工制品,其中有人试图修复他们在表面上看到的地方,但留下其他人过于拘束,更容易只是可以这么说,别管东西,关上壁橱的门。

以上是关于Matlab/Mex:mxarray.h 中的转换警告的主要内容,如果未能解决你的问题,请参考以下文章

如何找到 Matlab mex 文件的代码?

Cholesky 分解的 Matlab Mex C 实现

Matlab MEX-函数副作用

matlab mex:访问数据

Matlab mex 无法构建,但 gcc 可以

用于在 Windows 中的犰狳中构建 armaMex_demo.cpp 的 Matlab mex 命令