Matlab崩溃在运行一个特定的Fortan墨西哥人在MacOS文件

40视图(30天)
我从两个Fortran文件成功编译一个墨西哥人文件使用英特尔Fortran作曲家XE但Matlab崩溃当我试图运行墨西哥人(mexmaci64)文件。原始编码网关的人是在Windows上运行它(可能是Matlab 2020 b),这都是工作很好,所以我怀疑可能存在相容性问题。我用Matlab在MacOS文图拉13.0.1 2022 b。
我在另一个文件(https://es.mathworks.com/help/matlab/matlab_external/create-fortran-source-mex-file.html)上测试的,我成功地编译和运行顺利。
这是网关代码(我不能提供其他文件):
#包括< fintrf.h >
子例程mexFunction (nlhs plhs、nrhs prhs)
! ! !输入数据的指针:prhs和输出:plhs
mwPointerplhs (*),prhs (*)
! ! !正确的输入和左手边
整数nlhs,nrhs
! ! !指向内在matlab的函数库
mwPointermxgetpr,mxgetscalar! !,mxCreateString
mwPointermxgetm、mxgetn mxCreateDoubleMatrix
mwPointermxCreateCharMatrixFromStrings
C数组的信息:
mwSizev_size,cblk_size! !,props_size pname_size psys_size
C参数计算程序:
包括“parameters.h”
精密cblk_i (k5) ! !k5 = 12
精密v_i (l2) ! !l2 = 5
c双精度props_o (k5, 12 + k5)
c双精度psys_o (10 + k5)
精密props_o (9 + k5速率)! !双精度props_o (k5, 12 + k5)
精密psys_o (9 + k5)
c字符* 14名(速率)
字符* 14 pname_o(速率)
精密iPs,我
整数props_r,psys_r props_c psys_c! !、pname_r pname_c
整数props_s,iPs_s psys_s idead_s! !,pname_s
C输入数组的大小。
v_row = mxgetm (prhs (1))
v_col = mxgetn (prhs (1))
v_size = v_row * v_col
调用mxCopyPtrToReal8 (mxGetPr (prhs (1)), v_i, v_size)
cblk_row = mxgetm (prhs (2))
cblk_col = mxgetn (prhs (2))
cblk_size = cblk_row * cblk_col
调用mxCopyPtrToReal8 (mxGetPr (prhs (2)), cblk_i, cblk_size)
c调用FORTRAN程序
调用主要(pname_o props_o psys_o, iPs,被罩,v_i, cblk_i)
c创建零矩阵为默认输出
cpname_r = 1
cpname_c = k5
cpname_s = pname_r * pname_c
plhs (1) = mxCreateCharMatrixFromStrings (pname_o速率)
props_r =大小(props_o, 1)
props_c =大小(props_o, 2)
props_s = props_r * props_c
plhs (2) = mxCreateDoubleMatrix (props_r props_c 0)
psys_r =大小(psys_o, 1)
psys_c =大小(psys_o, 2)
psys_s = psys_r * psys_c
plhs (3) = mxCreateDoubleMatrix (psys_r psys_c 0)
plhs (4) = mxCreateDoubleMatrix (1 1 0)
plhs (5) = mxCreateDoubleMatrix (1 1 0)
c将输出数据从本地变量复制到matlab输出变量
c调用mxCopyCharacterToPtr (pname_o mxGetData (plhs (1)), pname_s)
调用mxCopyReal8ToPtr (props_o mxGetPr (plhs (2)), props_s)
调用mxCopyReal8ToPtr (psys_o mxGetPr (plhs (3)), psys_s)
调用mxCopyReal8ToPtr (iPs mxGetPr (plhs (4)), 1)
调用mxCopyReal8ToPtr(被罩,mxGetPr (plhs (5)), 1)
返回
结束
墨西哥人编译如下(我可以提供详细的报告):
墨西哥人- v网关。F main.f
然后从两个双变量输入如下(这就是它崩溃——我可以提供崩溃日志):
[a, b, c, d, e) =网关(v, cblk);
任何帮助将不胜感激!
1评论
詹姆斯Tursa
詹姆斯Tursa 2023年5月9日在3:16
timestwo要十分小心。f MATLAB doc的例子。这段代码有几个 严重的 错误,我无法获得TMW修复他们的医生。特别是代码变量类型或大小检查不正常,所以你可以通过做一些简单容易崩溃MATLAB传入一个数组而不是一个标量。

登录置评。

答案(1)

詹姆斯Tursa
詹姆斯Tursa 2023年5月9日的发布会
MATLAB Fortran API接口需要被视为一个引用传递接口。这意味着你需要的 确切的 类型参数或者事情会无法正常工作。确保这一点的唯一方法,特别是在不同的平台上,是 总是 使用变量参数, 从来没有 使用文字常量。你不能确保整数的大小要匹配。所以,你应该做的第一件事做任何更多的调试取代所有之前的文字常量与变量参数匹配的API签名 完全
例如,以这条线为例:
plhs (4) = mxCreateDoubleMatrix (1 1 0)
这些文字应该1和0 从来没有 用于Fortran语言调用API函数。相反,第一次看医生的签名:
#包括“fintrf.h”
mwPointermxCreateDoubleMatrix (m, n, ComplexFlag)
mwSizen
整数* 4 ComplexFlag
然后在你的电话使用这些精确的变量类型。例如,上面的代码应该是这样的:
mwSize::= 1
整数* 4::ComplexFlag = 0
:
plhs (4) = mxCreateDoubleMatrix (1, 1, ComplexFlag)
做每一个API调用,你目前有常数参数。只有这样你才能可靠地开始任何进一步的调试需要,检查输入变量的大小和类型等。
同时,我要把原来的程序员不使用隐式没有在他们的代码。说真的,这是为数不多的能帮助编译器可用来检测变量类型不匹配等国际海事组织这应该 总是 用于Fortran代码。
4评论

登录置评。

类别

找到更多的在Fortran和MATLAB帮助中心文件交换

s manbetx 845


释放

R2022b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的