Fortran Coder

查看: 224|回复: 3

[混编] IVF可以正常运行的代码在simulink中出现数值对不上的错误

[复制链接]

6

帖子

2

主题

0

精华

入门

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

子程序内

子程序内

子程序外

子程序外

796

帖子

2

主题

0

精华

大宗师

F 币
3787 元
贡献
2266 点
发表于 2024-3-11 14:24:09 | 显示全部楼层
一般是接口不匹配造成的,matlab默认8字节整型,数据类型和fortran不一样。

6

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
12 点
 楼主| 发表于 2024-3-11 14:47:09 | 显示全部楼层
li913 发表于 2024-3-11 14:24
一般是接口不匹配造成的,matlab默认8字节整型,数据类型和fortran不一样。

但是出错的地方还在Fortran内部,还没到和MATLAB进行交互。举个例子就是用子程序算个1+1=2,出来后把2传给MATLAB,但是进入子程序后变成了321546856+152438215这种乱值。我试过写成INTEGER*8,但是似乎也没用

6

帖子

2

主题

0

精华

入门

F 币
41 元
贡献
12 点
 楼主| 发表于 2024-3-31 16:15:04 | 显示全部楼层
问题解决了,是只要在子程序变量声明的地方加一个“SAVE”就不会出现变量值对不上的问题了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-22 17:34

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表