当通过 MEX 将一段 Fortran 2003(或更高版本)代码与 MATLAB 连接时,我惊讶地发现MEX 更改了默认逻辑. 这是致命的,因为一段完美编译的 Fortran 代码可能会因为类型不匹配而无法被 mexified,这种情况在我的项目中确实发生过。
\n这是一个最小的工作示例。
\n将以下代码命名为“test_kind.F”,在MATLAB中编译mex test_kind.F,然后test_kind在MATLAB中运行。这将生成一个名为 fort.99 的纯文本文件,其中包含两个数字“4”和“8”作为 WRITE 指令的结果。
! test_kind.F\n! Tested by MATLAB 9.8.0.1323502 (R2020a) with GNU Fortran (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0\n\n#include "fintrf.h"\n\n subroutine mexFunction(nlhs, plhs, nrhs, prhs)\n\n use ieee_arithmetic, only : ieee_is_nan\n implicit none\n mwPointer plhs(*), prhs(*)\n integer nlhs, nrhs\n\n write(99, *) kind(ieee_is_nan(1.0)) ! This prints a number in fort.99\n write(99, *) kind(.false.) ! A benchmark, …Run Code Online (Sandbox Code Playgroud) 更新20210914:Absoft 支持确认下面描述的af95/行为是无意的,并且确实是一个错误。af90Absoft 开发人员将努力解决这个问题。其他编译器在这方面的行为是正确的。感谢@Vladimir F 的回答、评论和建议。
我的印象是 Fortran 对于大小为 0 的数组很酷。但是,在 Absoft Pro 21.0 中,我遇到了涉及此类数组的(奇怪的)错误。相比之下,gfortran、ifort、nagfor、pgfortran、sunf95和g95都对同一段代码感到满意。
下面是一个最小的工作示例。
! testempty.f90
!!!!!! A module that offends AF90/AF95 !!!!!!!!!!!!!!!!!!!!!!!!
module empty_mod
implicit none
private
public :: foo
contains
subroutine foo(n)
implicit none
integer, intent(in) :: n
integer :: a(0)
integer :: b(n - 1)
call bar(a) ! AF90/AF95 is happy with this line.
call bar(b) ! AF90/AF95 is …Run Code Online (Sandbox Code Playgroud) fortran gfortran intel-fortran pgi-visual-fortran nag-fortran
像 cpp 和 fpp 这样的常见预处理器是否会扩展由一对引号括起来的宏?
我同时使用 cpp 和 fpp 尝试了以下代码,似乎引号内的宏没有展开。但是,我在有关 cpp 或 fpp 的任何文档中都没有找到此规则。任何人都可以指导我查看一些文档,以便我可以确定这种行为吗?谢谢。
#define X Y
X
"X"
'X'
Run Code Online (Sandbox Code Playgroud)