Fortran Coder

查看: 19872|回复: 15
打印 上一主题 下一主题

[混编] deallocate内存访问错误及DLL问题

[复制链接]

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

楼主
发表于 2015-4-16 08:51:53 | 显示全部楼层
有另外的问题,一般提倡另外发帖。(已帮你分隔)

问题1,不容易解决,通常这种错误都需要详细debug解决。有时候还可能需要反汇编解决。

问题2,一般我是设置 B 项目的输出路径,直接输出到 A 项目所在的位置。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2015-4-16 19:46:46 | 显示全部楼层
良好的编程习惯:
谁打开,谁关闭。谁分配,谁释放。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

板凳
发表于 2015-4-16 22:13:39 | 显示全部楼层
1. 在 test_main 里声明可分配数组
2. 调用 test_dll 里的一个函数,获得数组的大小 n
3. 在 test_main 里完成分配。allocate( x(n) )
4. 把 x 传递给 test_dll 里完成计算
5. 在 test_main 里 deallocate

由于可分配数组的内部实现,是编译器的问题(而语法是不干涉具体实现的)。而 DLL 又是windows的事情。
这几者间比较难以协调。

实际上,就算不用 DLL,单纯的 Fortran 工程,我也建议谁定义,谁分配,谁释放。

如果你确实确实要在主程序定义,DLL里分配,主程序释放。那我可能帮不了你。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2015-4-17 08:25:01 | 显示全部楼层
正如之前我说过的那样,这是具体编译器实现的问题。你要想深究为什么,恐怕只能反汇编分析。

正如 pasuka 所言,gfortran 是 OK的,所以不同编译器实现不一样。

同一个编译器,Debug 和 Release 的具体实现也不一样。我不认为研究这个问题有什么意义。

还是那句话:“即便不使用DLL,合理的规范的做法是:谁分配,谁释放”,尤其做大一些的工程时候,这不止是避免程序上出错,也可避免逻辑上出错。而后者非常重要。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

5#
发表于 2015-4-17 09:52:42 | 显示全部楼层
pasuka 发表于 2015-4-17 08:55
可分配数组传入子程序后在进行内存分配好像是F08新特性,有可能lz的IVF版本低,所以不支持?!
此外就是D ...

这是 F2003 特征,IVF是予以支持的。很早就支持了。这个不存在问题。

但是这个特征需要 interface,如果不再同一个module里,可能要单独书写 interface
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-7 18:16

Powered by Tencent X3.4

© 2013-2024 Tencent

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