| 查看: 2562 | 回复: 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人回复
» 本主题相关价值贴推荐,对您同样有帮助:
菜鸟求助关于fortran if循环的问题,经验丰富的前辈肯定一眼能看出问题出在哪
已经有3人回复
fortran 如何在子程序中实现动态数组的定义和声明?
已经有15人回复
菜鸟求助fortran数组声明及子程序的一些问题啊
已经有4人回复
Fortran输出二进制数据,用matlab读出,结果出错,求助问题何在?
已经有4人回复
fortran,gfortran,code block
已经有10人回复
fortran中的数组越界问题,
已经有3人回复
关于应用fortran编写高斯消去法程序来求解方程组的问题
已经有5人回复
fortran 程序有write和没有write两种情况计算的结果为什么会不一样?
已经有14人回复
求助:intel visual fortran的格式问题
已经有14人回复
请教 fortran 运行错误的原因
已经有13人回复
FORTRAN新手 求助主程序循环问题
已经有10人回复
Fortran如何读取数据避开空行?
已经有7人回复
请教一个fortran小程序编译出错的问题,谢谢
已经有9人回复
Fortran中关于数组的变化
已经有5人回复
【求助】Fortran语言赋值问题?
已经有3人回复
Fortran的格式化输入输出问题
已经有14人回复
【求助】FORTRAN写文件时每行开头都多了一个空格?
已经有6人回复
【求助】求指点,在Fortran里面,怎样实现“数组维度可调”的数组?
已经有5人回复
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
★
小木虫: 金币+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 |
» 本帖已获得的红花(最新10朵)
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
4楼2015-05-27 19:23:58
5楼2015-05-27 19:38:26
★
小木虫: 金币+0.5, 给个红包,谢谢回帖
小木虫: 金币+0.5, 给个红包,谢谢回帖
|
对,是一样的。不一样的只是你可以针对非空元素进行操作而已。 假设有n个有效数据,剩余的全是空值。那么,你排序只需要对这n个数据排序就行了,不需要提取出来也不需要中间数组。直接操作部分数组就行。 你可以把排序子程序写成这样: subroutine sort(array,n) integer*4 array(0:1000) integer*4 n !只有1~n元素是有效的 ...... !对1~n号元素排序 end subroutine sort 然后调用时,直接call sort(sta_info,sta_info(0))就行了。 这个原理和字符串的原理是类似的,定义一个长度1000的字符串,其实际长度为1001,其中有一位是用于记录字符串有效长度的,有效长度之外全部是空格。 |
6楼2015-05-28 08:13:16
|
你好,我还是有点不明白只对1~n号元素进行排序的意思,虽然我想要的是这个结果,是对n号元素排序之后新放到一个数组里面还是在原来的数组里面,最后面的还是空? allocate(sta_info(0:1000)) sta_info=-10000 !初始化为一个不常见的数,方便调试 sta_info(0)=55 !确定你需要的数组大小 do i=1,sta_info(0) sta_info(i)=..... enddo sta_info=-10000是相当于给这数组一个unit嘛?不太明白这个初始化的意思。。 sta_info(0)=55 !确定你需要的数组大小 do i=1,sta_info(0) sta_info(i)=..... enddo 这个当把第二个循环的大小确定为100的时候,怎么样能使它接着在sta_info后面写45个数据,这样应该会使它覆盖掉前一循环的数据吧?还是把大小也存放到一个数组里面,每次循环do从sta_num(i-1)~sta_num(i)? |
7楼2015-05-28 09:48:17
|
你好,这是我程序里面的一部分,但是这样在第二个循环的时候就会触发断点,这样的话,存储大小会溢出?如果我直接把大小设置为1000,就不会触发断点 integer::sta_array_size=0 integer::day_sta_num=0 sta_array_size = sta_array_size + day_sol_sum%sta allocate(sta_info(sta_array_size)) do j=1,day_sol_sum%sta,1 read(101,'(a)',end=200) sum_line sta_info(day_sta_num+j)%sta_name=sum_line(2:5) sta_info(day_sta_num+j)%phase_RMS=sum_line(10:13) sta_info(day_sta_num+j)%weekday=doy-start_doy+1 end do day_sta_num = day_sol_sum%sta + day_sta_num |
8楼2015-05-28 10:58:38
9楼2015-05-28 11:45:15
10楼2015-05-28 11:49:08













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