Fortran Coder

标题: IVF可以正常运行的代码在simulink中出现数值对不上的错误 [打印本页]

作者: Alohafancy    时间: 2024-3-11 10:53
标题: IVF可以正常运行的代码在simulink中出现数值对不上的错误
我在尝试把一个Fortran77写成的大型代码打包成一个S函数放在simulink中调用,目前可以正常生成.mexw64文件和S函数,编译正常通过不会报错。但是实际运行simulink时MATLAB会崩溃。通过在Fortran代码里写输出文件的方式定位到问题所在,发现是Fortran中的实参并没有传递给子程序,子程序中对应的量是乱值。这种情况需要怎么解决呢?
在VISUAL STUDIO下,原Fortran代码是可以正常运行的,但是实际运行就会出现变量的值对不上的问题。
由于Fortran代码比较老,有很多不规范的写法,比如未经声明就使用变量,形参实参变量类型不一致。但很神奇的是在IVF中可以正常运行,只有放到MATLAB里才发现有问题。
VS里有设置项目属性的方式,可以忽略数组上限,不检查例程交互,默认变量初值为0之类的,把这些都关闭后,Fortran代码也会出错。但是打开后就能正常运行。MATLAB里有没有类似的可以设置这种属性的地方?
下面是出错地方的例子,排查掉很多了,但如果继续这么排查下去,不知道要多久。
图中的L2按道理应该是0,1,但是实际MATLAB运行中的值是很大的一个整数

错误2.png (22.96 KB, 下载次数: 54)

子程序内

子程序内

错误1.png (16.36 KB, 下载次数: 53)

子程序外

子程序外

作者: li913    时间: 2024-3-11 14:24
一般是接口不匹配造成的,matlab默认8字节整型,数据类型和fortran不一样。
作者: Alohafancy    时间: 2024-3-11 14:47
li913 发表于 2024-3-11 14:24
一般是接口不匹配造成的,matlab默认8字节整型,数据类型和fortran不一样。

但是出错的地方还在Fortran内部,还没到和MATLAB进行交互。举个例子就是用子程序算个1+1=2,出来后把2传给MATLAB,但是进入子程序后变成了321546856+152438215这种乱值。我试过写成INTEGER*8,但是似乎也没用
作者: Alohafancy    时间: 2024-3-31 16:15
问题解决了,是只要在子程序变量声明的地方加一个“SAVE”就不会出现变量值对不上的问题了




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2