24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2560  |  回复: 12

qingkonggzc

银虫 (小有名气)

引用回帖:
10楼: Originally posted by 浔荆 at 2015-05-28 11:49:08
在哪行断掉的?报错信息是什么?...

是不是必须要先定义一个大的数组,这样才能
sta_info(0)=sta_info(0)+1
     sta_info(sta_info(0))=....     !在这里写入新数据
这样用呢?能不能就让它占多大就定义多大的大小?
我出错的地方时第二个循环的时候allocate(sta_info(sta_array_size))触发断点,我是没有先定义一个大数组,就直接先定义一个满足第一个循环的,然后再sta_array_size = sta_array_size + day_sol_sum%sta
allocate(sta_info(sta_array_size))把第二个循环的加上去,相当于加大数组大小,这样会报错。
11楼2015-05-28 20:56:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

浔荆

木虫 (正式写手)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
11楼: Originally posted by qingkonggzc at 2015-05-28 20:56:39
是不是必须要先定义一个大的数组,这样才能
sta_info(0)=sta_info(0)+1
     sta_info(sta_info(0))=....     !在这里写入新数据
这样用呢?能不能就让它占多大就定义多大的大小?
我出错的地方时第二个循环的 ...

显然不能啊。。。
fortran语法是比较严格的,要么定义成固定大小的数组,要么定义成动态数组。但不管是哪个,数组在用的时候都有一个确定的长度。
你可以随时deallocate然后再allocate,但这样的计算效率是比较低的。
定义一个0:1000的数组只是多占用一些内存而已,由于sta_info(0)已经标明了数组大小,实际排序的时候也只排序1:sta_info(0)个元素,效率上并没有降低。
如果实在是内存不够,需要控制内存开销的话,可以选择性的deallocate再allocate数组。例如一开始定义为0:100,添加新元素时先判断数组是否已经满了,不够用时,再重新定义成0:200,还不够用就0:400,以此类推。
以下是示意性代码
subroutine extend_array()
allocatable,integer*4::sta_info_dummy(:)

if(sta_info(0)>=sizeof(sta_info))then
   allocate(sta_info_dummy(sta_info_size)) !定义中间数组保存数据
   sta_info_dummy=sta_info
   deallocate(sta_info)                         !扩张数组大小
   allocate(sta_info(sta_info_dummy(0)*2))     
   sta_info(1:sta_info_size)=sta_info_dummy   !恢复数据
endif
end subroutine extend_array

» 本帖已获得的红花(最新10朵)

12楼2015-05-29 14:16:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

qingkonggzc

银虫 (小有名气)

送红花一朵
引用回帖:
12楼: Originally posted by 浔荆 at 2015-05-29 14:16:12
显然不能啊。。。
fortran语法是比较严格的,要么定义成固定大小的数组,要么定义成动态数组。但不管是哪个,数组在用的时候都有一个确定的长度。
你可以随时deallocate然后再allocate,但这样的计算效率是 ...

恩,好的 ,谢谢,我先研究一下,有问题再向您请教
13楼2015-05-29 20:43:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 qingkonggzc 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见