Fortran Coder

标题: 请问为什么这个模块无法被调用,另外还有一些关于模块..... [打印本页]

作者: 盛世青衫    时间: 2024-1-3 15:27
标题: 请问为什么这个模块无法被调用,另外还有一些关于模块.....
本帖最后由 盛世青衫 于 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,或者更改代码结构了
感激不尽,感激不尽


aa6e0f9eb935eaaa22db748d6cf36b7.png (29.88 KB, 下载次数: 76)

程序结构

程序结构

d3dde87e8e410f4964dc9d82ea68465.png (13.22 KB, 下载次数: 70)

程序编译报错

程序编译报错

8f815124c62373b6cf09664f6e78c65.png (122.8 KB, 下载次数: 72)

主程序编译报错位置

主程序编译报错位置

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


作者: 盛世青衫    时间: 2024-1-4 09:42
本帖最后由 盛世青衫 于 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


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

感谢感谢
作者: 盛世青衫    时间: 2024-1-5 10:45
Transpose 发表于 2024-1-3 17:38
放在main的前面

感谢




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