| 查看: 2564 | 回复: 12 | |||
| 当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖 | |||
[交流]
fortran动态数组大小分配问题(allocatable)?已有2人参与
|
|||
各位大神,我定义了一个动态数组type(sta_information),allocatable::sta_info( ,在给sta_info分配大小的时候遇到了问题,我有一个循环,想让这个数组的大小随着循环变化可以吗?还是必须要开始时就指定一个较大的能放下所有数据/字符串的数组?因为我把所有数据放进去之后要进行从A到Z的排序,如果数组太大有空的会不会影响排序?就是第一个循环大小分配55,到第二个循环的时候让他大小变成100,第三个循环的时候大小变成200(也就是分别产生55,45,100个数据),因为不知道数据总量,不想刚开始就把大小设置的比较大,比如allocate(sta_info(1000))等,请问这个可以如何处理,谢谢~~~ |
» 猜你喜欢
到新单位后,换了新的研究方向,没有团队,持续积累2区以上论文,能申请到面上吗
已经有7人回复
申请2026年博士
已经有5人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有5人回复
寻求一种能扛住强氧化性腐蚀性的容器密封件
已经有6人回复
2025冷门绝学什么时候出结果
已经有7人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有6人回复
Bioresource Technology期刊,第一次返修的时候被退回好几次了
已经有7人回复
请问哪里可以有青B申请的本子可以借鉴一下。
已经有4人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复
康复大学泰山学者周祺惠团队招收博士研究生
已经有6人回复
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
小木虫: 金币+0.5, 给个红包,谢谢回帖
|
显然不能啊。。。 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 |
12楼2015-05-29 14:16:12
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
小木虫: 金币+0.5, 给个红包,谢谢回帖
|
我也常遇到这样的问题,一般我是通过以下方案解决的。 定义一个很大的数组,如sta_info(0:1000)。 之所以定义成sta_info(0:1000)而非sta_info(1:1000),并不是因为我习惯了C语言里的数组默认下标从0开始。实际上,这里的sta_info(0)和其他元素不一样,它是用来记录整个数组的有效大小的。 例如,我们在第一个循环给元素0:55赋值,其他的元素用不到,可以这么实现: allocate(sta_info(0:1000)) sta_info=-10000 !初始化为一个不常见的数,方便调试 sta_info(0)=55 !确定你需要的数组大小 do i=1,sta_info(0) sta_info(i)=..... enddo 简单来说,就是先分配足够的大小,但另外定义一个变量来描述它的实际大小。这样一来避免了数组大小变化的时候,需要频繁的allocate和deallocate。另一方面又可以避免数组太大而带来的速率降低。(排序这样的数组操作,只需要对1:sta_info(0)这些元素进行即可) |
2楼2015-05-27 08:19:38
pippi6
铁杆木虫 (著名写手)
工程和科学数值计算咨询
- 应助: 413 (硕士)
- 贵宾: 0.002
- 金币: 7116.5
- 散金: 15
- 红花: 63
- 帖子: 1639
- 在线: 798.9小时
- 虫号: 2469437
- 注册: 2013-05-14
- 专业: 计算数学与科学工程计算
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
小木虫: 金币+0.5, 给个红包,谢谢回帖
|
subroutine DynamicArray implicit none real*8, allocatable, dimension( :: sta_infointeger :: i,n=20,j do i=1,n allocate(sta_info(i)) do j=1,i sta_info(j)=j end do print*,' i=',i,' sizeof(sta_info)=',sizeof(sta_info) deallocate(sta_info) end do end subroutine DynamicArray |
3楼2015-05-27 13:14:14
4楼2015-05-27 19:23:58













,在给sta_info分配大小的时候遇到了问题,我有一个循环,想让这个数组的大小随着循环变化可以吗?还是必须要开始时就指定一个较大的能放下所有数据/字符串的数组?因为我把所有数据放进去之后要进行从A到Z的排序,如果数组太大有空的会不会影响排序?
回复此楼
qingkonggzc