问一个FORTRAN关于全局变量的问题(可以追分哦)
F90定义全局变量有两个方法:1,单独的common语句(虽然很老,一般不用了,但还是可以用,在变量少的情况下)。2,module模块。我先分用两种方法举例说明我的问题:...
F90定义全局变量有两个方法:1,单独的common语句(虽然很老,一般不用了,但还是可以用,在变量少的情况下)。2,module模块。
我先分用两种方法举例说明我的问题:
1. 有一个常数A和一个二维数组B(10,10)定义为全局变量,
写为:real::A,B(10,10)
Common::A,B(10,10)
会出现错误Error: The dimensions of this array have been defined more than once. B
如写为:real::A
Common::A,B(10,10)
会出现错误:Error: This name does not have a type, and must have an explicit type. B
我看了些书,都讲得不是很清楚,哪些要作为全局变量来定义(是其他子程序要用,要共享的数据吗),对常数,一维数组,二维数组等定义有什么要求,才会避免以上错误。
2,主要我是新手看的都是些老程序,module实在不会用,虽然都说简洁,和common单独用有什么区别 ,望高手指点,谢谢 展开
我先分用两种方法举例说明我的问题:
1. 有一个常数A和一个二维数组B(10,10)定义为全局变量,
写为:real::A,B(10,10)
Common::A,B(10,10)
会出现错误Error: The dimensions of this array have been defined more than once. B
如写为:real::A
Common::A,B(10,10)
会出现错误:Error: This name does not have a type, and must have an explicit type. B
我看了些书,都讲得不是很清楚,哪些要作为全局变量来定义(是其他子程序要用,要共享的数据吗),对常数,一维数组,二维数组等定义有什么要求,才会避免以上错误。
2,主要我是新手看的都是些老程序,module实在不会用,虽然都说简洁,和common单独用有什么区别 ,望高手指点,谢谢 展开
4个回答
展开全部
题主好,现在是20170805的凌晨,搜索到这个题目,想补充一下,完善这个问题。
其实对于你标号1举出的两种弹出错误,我在中科大的fortran教材上看到一句话,很简短但是能够非常扼要的指出错误点。
这句话是:当COMMON语句指定了数组的秩和大小后,只能定义数组的类型而不能再次重复给定维界。
所以对于你的错误1,是触犯了再commony已经声明了数组的秩和大小后,变量类型定义中又再次声明大小的错误。而错误2则是因为B数组只声明了公共区、秩、大小,但是没有声明类型。这就是报错的原因。
然后是大的问题2,关于common和module的用法区别。
common是开辟公共内存,实现不同过程中的不同变量访问同一个内存位置。
module可以实现的是直接定义了全局变量,在不同函数中使用同一个变量名访问同一个内存位置。
如果想用Module实现common的功能,则可以使用Module中的变量改名功能。
题主应该都明白了,主要希望能为后来人做点贡献。
其实对于你标号1举出的两种弹出错误,我在中科大的fortran教材上看到一句话,很简短但是能够非常扼要的指出错误点。
这句话是:当COMMON语句指定了数组的秩和大小后,只能定义数组的类型而不能再次重复给定维界。
所以对于你的错误1,是触犯了再commony已经声明了数组的秩和大小后,变量类型定义中又再次声明大小的错误。而错误2则是因为B数组只声明了公共区、秩、大小,但是没有声明类型。这就是报错的原因。
然后是大的问题2,关于common和module的用法区别。
common是开辟公共内存,实现不同过程中的不同变量访问同一个内存位置。
module可以实现的是直接定义了全局变量,在不同函数中使用同一个变量名访问同一个内存位置。
如果想用Module实现common的功能,则可以使用Module中的变量改名功能。
题主应该都明白了,主要希望能为后来人做点贡献。
展开全部
不要使用common
直接用module
在module里面定义变量
然后在程序里引用,作为全局变量使用
例如:
moduLe constantDATA
REAL,PARAMETER :: Pi = 3.14159265359, vC = 3.e8
compLex,PARAMETER :: cj = (0.0, 1.0)
REAL vf, vk, vw, vwaveLength, eta
compLex, SAVE :: cjvk
endmoduLe
program test
use constantDATA
print*,Pi
end
就像上面这个例子这样用就可以的
直接用module
在module里面定义变量
然后在程序里引用,作为全局变量使用
例如:
moduLe constantDATA
REAL,PARAMETER :: Pi = 3.14159265359, vC = 3.e8
compLex,PARAMETER :: cj = (0.0, 1.0)
REAL vf, vk, vw, vwaveLength, eta
compLex, SAVE :: cjvk
endmoduLe
program test
use constantDATA
print*,Pi
end
就像上面这个例子这样用就可以的
更多追问追答
追问
请问一下,只在一个子程序里用的变量不是全局变量,那它在哪里声明了,可以在MODULE里声明吗
多个子程序共用的是全局变量,在MODULE里声明,COMMON和SAVE都能实现全局变量的功能,
real::A,B(10,10)
Common A,B
common A,B(10,10)
real A,B
上面两个哪个对啊 谢谢
追答
在一个子程序里用的变量不是全局变量
是可以在module里面定义的
real::A,B(10,10)
Common A,B
这样使用就可以了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以尝试这样:
common A,B(10,10)
real A,B
我不知道这里你明白不明白::的作用,它是用在赋初值或同时声明各种属性时用的,这里没有这些,可以不用它
common A,B(10,10)
real A,B
我不知道这里你明白不明白::的作用,它是用在赋初值或同时声明各种属性时用的,这里没有这些,可以不用它
追问
你的跟1楼不一样都不知道看谁的了
谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
real::A,B(10,10)
Common A,B
Common A,B
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询