fortran面向对象编程(date 类)
2013-08-15 15:10阅读:
在家也没闲着哦
date类功能
date主要是将时间转化为一个相对应的浮点数来表示,可以设定每个对象表示时间,然后获得各个时间对应的浮点数。
浮点数单位为天(day),及每单位1表示1d = 24h = 24×60min =
24×3600s,但是为了减少转化为浮点数时产生的误差,将浮点数精度设定为14位,即表示1s所需天数小数位长度。
我们将原点设置为,公元1年1月1日 0:00:00,那么以此为基点,'2010-07-11
00:00:00'对应的实数为
733994.00000000000,也就是说2010年7月11日距公元1日共有733994天。
设定对象时间时候可以用字符串方法,例如'2010-07-11
00:00:00',也可以用向量形式,例如[2010,07,10,01,00,00]这样的六个元素的向量。
date类主要内容
属性
|
类型
|
说明
|
date_str
|
character
|
储存日期字符串,形式:'2010-07-10 18:20:00'
|
date_vec
|
integer
|
TD>
储存日期向量,形式:[2010 07 10 18 20 00]
|
date_time
|
real(kind=select_real_kind(p=14))
|
储存日期对应的实数,精度13位,指数6位
|
类型
|
pri
|
方法
|
说明
|
|
+
|
set_date(this,str/vec)
|
设定对象表示时间
|
subroutine
subroutine
|
-
|
set_date_str(this,str)
|
通过字符串设定时间
|
-
|
set_date_vec(this,vec)
|
通过向量设定时间,向量必须包含6个元素
|
subroutine
|
+
|
get_date_str(this,str)
|
获得表示对象时间的字符串
|
subroutine
|
+
|
get_date_vec(this,vec)
|
获得表示对象时间的向量
|
subroutine
|
+
|
get_date_real(this,time)
|
获得表示对象时间的实数
|
function
|
-
|
num_in_the_year(this)
|
计算该时刻在一年中的时间
|
function
|
-
|
trans_vec2str(vec)
|
时间从向量形式转化为字符串形式
|
function
|
-
|
trans_str2vec(str)
|
时间从字符串形式转化为向量形式
|
function
|
-
|
trans_vec2realtime(this)
|
时间从向量形式转化为表示时间的实数
|
function
|
|
is_leap_year_fn(year)
|
判断某一年是否为闰年
|
说明:
- pri表示方法是私有(-)或是公有(+);
- 变量this表示一个date对象,str为形式为'2010-07-10
18:20:00'的长度为19的字符串,vec为长度为6的整型向量,year是表示年份的整数,time为对应时间的一个精度14位浮点数。
fortran面向对象方法
fortran实现面向对象编程,主要通过用户自定义类型type的定义来完成。
-
用户自定义类型中包含的变量可以添加private关键字,作为类成员的属性,用户使用类构建对象时候无法对对象的属性直接操作,这就完成了封装功能。
-
通过contains关键字,自定义类型和方法进行绑定,并且方法用public和private关键字进行定义,说明方法是否为私有函数。另外加在模块中将所有方法定义为私有,那么对象定义的私有方法才真正意义上实现'私有'。
- 使用generic关键字实现方法重载,对于某种功能函数,能够用多种类型变量作为参量调用将会非常方便。
date类中各个函数功能详细说明
因为私有函数主要被其他过程调用,首先介绍私有函数
-
num_in_the_year(this)判断某个时刻是该年的第几天。当然,该天数应该精确到小数后8位,达到1s的精度。该天数最小为0,最大小于365(闰年小于366)。参数为date类型对象。
- is_leap_year_fn(year)判断某年是否为闰年,输入表示年份整数。
- trans_vec2str(vec)将表示时间的包含六个元素的向量转化为'2010-07-10
18:20:00'形式的字符串。
-
trans_str2vec(str)将表示时间的19个字符长度的字符串转化为包含六个元素的向量。
-
trans_vec2realtime(vec)将表示时间的包含六个元素的向量转化为该时刻对应的浮点数
-
set_date_str(this,str)通过字符串形式设定对象表示时间,此过程包含trans_str2vec(str)、trans_vec2realtime(vec)
-
set_date_vec(this,vec)通过向量形式设定对象表示的时间,此过程包含trans_vec2str(vec)、trans_vec2realtime(vec)
公有函数共4个:
-
set_date(this,str/vec)函数重载了set_date_str(this,str)、set_date_vec(this,vec)两个私有函数的方法,可以通过字符串或者向量形式设定对象表示的时间。
- get_date_str(this,str)获得对象表示时间的字符串形式
- get_date_vec(this,vec) 获得对象表示时间的向量形式
- get_date_real(this,time) 获得对象表示时间对应的浮点数
下面就是一些细节和遇到的问题:
1、对于设定对象时间函数set_data_vec函数来说,本来是用function过程即可(输入一个向量,返回date对象)。但是形参列表中没有date对象无法与date类型进行绑定。故需要使用subroutine过程,date对象作为形参中一个输入。
2、用户自定义对象绑定过程时,对于gun编译器,尽量使用subroutine过程,使用function时候gun编译器报错。
function get_date_vec(this)
implicit none
integer, dimension(6) ::
get_date_vec
class(date) :: this
get_date_vec = this�te_vec
endfunction get_date_vec
调用时候:
temp = now%get_date_vec()
调用模块进行编译时候报错:
$ gfortran test.f90 mod_date.o -o
main
test.f90:
在函数'test'中:
test.f90:13:0: 编译器内部错误:在
gfc_conv_variable 中,于
fortran/trans-expr.c:551
请提交一份完整的错误报告,
如有可能请附上经预处理后的源文件。
具体步骤请参见
<http://gcc.gnu.org/bugs.html>。
3、get_date_str需要字符串作为形参输入子例程中,字符串长度固定为19字符。(形式:'2010-07-10
18:20:00')
num_in_the_year_fn计算某年中时刻对应的实数(不超过365):
(1)'年月日'相比时刻'时分秒'有所不同:'年月日'第一个序号为1,而'时分秒'序号起始为0,,故经过的月份和日期都要减1,度过的时分秒则不需要。
(2)精度select_real_kind(p=14)情况下,1h误差为8.8×10
-10
select_real_kind(p=17)情况下,1h误差为5.6×10
-13
4、trans_str2vec(str)和trans_vec2str(vec)作用为将时间从字符串形式与向量形式之间相互转化。其中主要为整型和字符串型变量之间相互转化,使用内部文件方法:
(1)整型=
≫字符型:write写入字符串中
character(len = 19) ::
trans_vec2str
character(len = 4) :: year
write(year,'(i4)')vec(1)
!
特别注意,格式'(i4)'
是写入的整型变量vec(1)
的格式,而非字符变量year
的格式
(2)字符型=
≫整型:read从字符串中读入
integer, dimension(6) ::
trans_str2vec
character(len = 19) :: str
read(str(1:4),*)trans_str2vec(1)
read(str(6:7),*)trans_str2vec(2)
read(str(9:10),*)trans_str2vec(3)
read(str(12:13),*)trans_str2vec(4)
read(str(15:16),*)trans_str2vec(5)
read(str(18:19),*)trans_str2vec(6)
mod_date.f90
下面贴上包含date类模块全部代码: