Fortran Coder

查看: 301|回复: 6

[Module] 请问为什么这个模块无法被调用,另外还有一些关于模块.....

[复制链接]

17

帖子

6

主题

0

精华

入门

F 币
78 元
贡献
40 点
发表于 2024-1-3 15:27:19 | 显示全部楼层 |阅读模式
本帖最后由 盛世青衫 于 2024-1-3 16:02 编辑

各位大神好,请教个问题,我的本意是通过76/114这两个子程序计算几个数值,让这几个数值返回主程序在主程序中继续进行计算。经过大神指导,我放弃了common,我书写了 一个模块,我也学习了雪球大神的教程,但是还是有几个问题不明白
(1)对于模块声明public变量的这几个位置,就是我的代码74行这个位置,这几个变量是下面两个子程序输出的我需要的数值,需要他们回到主程序进行计算,请问我这样书写是否能让这两个变量回到主程序中进行计算。如果书写有误,请不吝赐教。感谢
(2)对于use这个模块,第二行这个报错位置,他提示我如下报错形式(我使用的是Gfortran(simply fortran))
Cannot open module file 'module1.mod' for reading at (1): No such file or directory
compilation terminated.
Error: Last command making (build\6_5ifexit.o) returned a bad status
Error: Make execution terminated
请问如何解决,感激不尽。
(3)第三个问题,想请问一下,我记得雪球大神说module不能用在77语言中,请问我这个形式如果在77中如何处理能让这两个变量传回主程序中,是否只能用common,或者更改代码结构了
感激不尽,感激不尽


程序结构

程序结构

程序编译报错

程序编译报错

主程序编译报错位置

主程序编译报错位置

151

帖子

2

主题

1

精华

大师

Vim

F 币
930 元
贡献
453 点

规矩勋章

发表于 2024-1-3 17:38:47 | 显示全部楼层
放在main的前面

1938

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1255 元
贡献
529 点

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

发表于 2024-1-3 21:20:34 | 显示全部楼层
1. 你给的代码不全,截图只是一部分,所以没法判断你书写是否正确合理。
2. module代码放在前面,或者另外存一个 *.f90 源代码文件,然后包含在项目中。
3. 是的。module 是 F90 新增的语法,F77不能使用。只要你的编译器支持F90,没有任何理由把自己限定在77语法里。
(请注意,固定格式和自由格式,并不是77和90的区别。90是支持固定格式和自由格式的)

17

帖子

6

主题

0

精华

入门

F 币
78 元
贡献
40 点
 楼主| 发表于 2024-1-4 09:42:08 | 显示全部楼层
本帖最后由 盛世青衫 于 2024-1-4 09:56 编辑
fcode 发表于 2024-1-3 21:20
1. 你给的代码不全,截图只是一部分,所以没法判断你书写是否正确合理。
2. module代码放在前面,或者另外 ...

您好,雪球大神,我将模块提前了,但是因为两个名称一样它提示我
85 |     use module1
      |        2                                             
......
  101 |     real(kind=8) qulv_x_i,qulv_x_j,mid,qulv_x,qulv_i_j,wucha_m_mid
      |                                                      1
Error: Symbol 'qulv_i_j' at (1) conflicts with symbol from module 'module1', use-associated at (2)
我没有找到相关的解决办法,我将主程序内(第101行处)的定义删掉了,请问有没有别的更好的处理方法,我看如果我在一开始module里写上SAVE,他是不是说明可以相当于全局变量,是不是因为这样导致的这个报错出现。
同时我还有一个问题,今天早上我突然对子程序的虚参和实参有一点新的认识,比如我在主程序中call(a,b,c),其实如果我在主程序中调用这个abc他其实是可以传回来的,那我应该可以其实假设一个参数D,
写成call(a,b,c,d)让他在子程序的最后等于我要传回主程序的值,这样是不是也不用大改子程序也可以传回我想要的参数。但是这样我发现好像只能回传到上一级。可能比模块还是有很大的缺陷。
同时我上传了我的程序,希望您能帮我看看如果我一开始在module里面一开始声明几个变量,他是否能回传到主程序中。
刚刚接触,可能词不达意,多有叨扰,还望见谅
感激不尽


6_5ifexit.f90

6.41 KB, 下载次数: 1

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

发表于 2024-1-5 08:28:22 | 显示全部楼层
module 里声明的变量,就是全局变量,在模块内部contains后面的子程序和主程序里都不必声明直接使用,可以当公共变量用。
主程序里 use module1 语句后不要再声明和模块同名的变量,去掉主程序中 qulv_i_j 的定义就没有你说的错误了。
如果要保留子程序的计算结果,变量和数组都可以直接放模块中,任何地方的修改都会保存,不用考虑能不能传回来。
save不是你想的那么用的,是用在子程序里保存局部变量的。

17

帖子

6

主题

0

精华

入门

F 币
78 元
贡献
40 点
 楼主| 发表于 2024-1-5 10:26:20 | 显示全部楼层
necrohan 发表于 2024-1-5 08:28
module 里声明的变量,就是全局变量,在模块内部contains后面的子程序和主程序里都不必声明直接使用,可以 ...

感谢感谢

17

帖子

6

主题

0

精华

入门

F 币
78 元
贡献
40 点
 楼主| 发表于 2024-1-5 10:45:27 | 显示全部楼层

感谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-2-25 14:09

Powered by Tencent X3.4

© 2013-2024 Tencent

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