【问题标题】:The return type of mxIsDouble, mxIsSingle, and mxIsClass (MATLAB mex for Fortran)mxIsDouble、mxIsSingle 和 mxIsClass 的返回类型(MATLAB mex for Fortran)
【发布时间】:2019-07-29 02:33:14
【问题描述】:

根据https://www.mathworks.com/help/matlab/apiref/mxisclass.html Fortran(还有 mxIsSingle 和 mxIsClass)的 mxIsDouble 的返回值为 INTEGER*4。

这是我的问题:

  1. mxIsDouble 的声明是否应该一直是

    整数*4 :: mxIsDouble ?

如果我将其声明为

INTEGER :: mxIsDouble

LOGICAL :: mxIsDouble ?
  1. 据说INTEGER*4不是标准的,应该换成kind。我该怎么做?我知道 INTEGER(KIND=4) 不正确。另外,为什么 mex 继续使用这样的非标准功能?

背景:我在为一些 Fortran 遗留代码编写 MATLAB 接口时遇到了这些问题。我在使用 Linux 的 64 位 PC 上工作,但我的目标是编写 portable mex 文件。

非常感谢!

【问题讨论】:

  • INTEGER*4 从来都不是 Fortran 标准的一部分,那么它怎么会过时呢?您需要询问 Mathworks 为什么它继续使用非标准语法。只需使用INTEGER,因为此声明对应于默认整数类型。
  • 在向 Mathsworks 抱怨他们损坏的界面和文档之后,最好的选择可能是查看标准模块 iso_fortran_env 中的常量 int32、real32 和 real64
  • 谢谢@evets。我已经编辑了问题并将“过时”替换为“非标准”。如果我使用 INTEGER 来声明这些函数,尽管我的计算机上的默认整数是 64 位而函数返回 32 位整数,但一切都会正常工作吗?非常感谢!
  • 您使用的是什么计算机和操作系统?默认INTEGER 的大小与默认REAL 的大小相同,很可能是32 位。您可以使用STORAGE_SIZE 内部函数以位为单位输出大小。
  • 谢谢@Steve。我正在使用 64 位 MATLAB 的 Linux PC 上工作。在最近发布的 MATLAB(例如,MATLABR2018a)中,似乎我们不一定有“默认 INTEGER 与默认 REAL 的大小相同”。在我的电脑上,当使用选项 -largeArrayDims 时,默认的 INTEGER 是 64 位,而默认的 REAL 是 32 位。 STORAGE_SIZE 听起来很有用,但它只在 Fortran 2008 之后可用。我们在 Fortran90 中是否有类似的功能?非常感谢。

标签: matlab fortran mex matlab-deployment


【解决方案1】:

您应该使用 INTEGER*4,因为它与 MATLAB API 文档相匹配,无论它是非标准的。不要使用 INTEGER,因为这可能会根据您的设置编译为 64 位整数,并且与库函数不匹配。请记住,您正在链接到一个已编译的返回 32 位整数的库函数……您没有重新编译 mxIsDouble 函数。例如,

INTEGER*4, external :: mxIsDouble

我认为 MATLAB 极不可能将这些函数更改为返回 32 位整数以外的任何内容,但我想您可以为此创建自己的类型,以便 INTEGER*4 仅出现在代码中的一个位置.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2021-05-18
    • 2013-11-17
    相关资源
    最近更新 更多