Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Matlab/Mex:mxarray.h中的转换警告_C++_Matlab_Visual Studio_Mex - Fatal编程技术网

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

C++ Matlab/Mex:mxarray.h中的转换警告,c++,matlab,visual-studio,mex,C++,Matlab,Visual Studio,Mex,我正在为Matlab编写一个mex函数,并在编译过程中注意到Visual Studio 2017发出的警告。在几乎删除了除include和mex函数的裸包装器之外的所有内容后,我不得不得出结论,警告实际上指向了库本身: #include <mexplus/mxarray.h> void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { } 我查看了该文件,确实有一个循环在size\

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

#include <mexplus/mxarray.h>

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

}
我查看了该文件,确实有一个循环在
size\u 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:  }
因此,由于
size\u t
int
的转换已经在不同的环境中造成了一些混乱,我的问题是:

  • 我可以安全地忽略这一点吗
  • 任何人都有理由这样编写函数
    fieldName()
    (或者更确切地说,要求函数
    fieldName(int index)
    以整数作为参数)
  • 此警告是否实际指向配置文件中的错误

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

      下面是一个很好的描述,说明了为什么循环可以这样写 发件人:

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

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

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

      此警告是否实际指向配置文件中的错误

      我不这么认为

      我可以安全地忽略这一点吗


      谢谢,这回答了我所有的主要问题。也感谢参考<代码> SiZeSt,因为我在很长一段时间后回到C++,我忘记了它的定义。我只是想知道,为什么MathWorks不继续,还定义了
      fieldName
      来采用
      size\u t
      而不是
      int
      。但是可能有一些逻辑,只有在查看其中一个API的工作方式时才会显示出来(
      mxGetFieldNameByNumber
      正在调用一个API,从它的定义来看,我假设:
      LIBMMWMATRIX\u PUBLISHED\u API\u EXTERN\u C const char*mxGetFieldNameByNumber
      )。欢迎您的光临,并进行良好的跟进。我也在想,当它们与其他地方的
      std::
      命名空间引用一致时,为什么它们不将
      size\u t
      称为
      std::size\u t
      。这里可能有一些逻辑,或者它可能只是一个拥有更大代码库的工件,在这里,有人试图在表面上看到的地方修复他们能修复的东西,但留下其他人太过拘束,可以说,把事情放在一边,关上壁橱门就更容易了。
      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:  }
      
      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);
      }