浔荆

我也常遇到这样的问题,一般我是通过以下方案解决的。

定义一个很大的数组,如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)这些元素进行即可)

pippi6

subroutine DynamicArray

implicit none

real*8, allocatable, dimension( :: sta_info

integer :: 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

qingkonggzc

引用回帖:

浔荆 at 2015-05-27 08:19:38

我也常遇到这样的问题,一般我是通过以下方案解决的。

定义一个很大的数组,如sta_info(0:1000)。

之所以定义成sta_info(0:1000)而非sta_info(1:1000),并不是因为我习惯了C语言里的数组默认下标从0开始。实际上, ...

你好,谢谢。

首先这样和直接定义一个较大的数组,然后依次把数据/字符串写进去效果应该是一样的吧,就是有多少数据写多少空间的,剩下的还是空的,然后对其进行排序?这个直接把总共有多少数据计算出来,然后对这1-n个数据进行排序后面的没有影响吗?还是把这1-n个数据提取出来放到一个新的数组里面?

qingkonggzc

引用回帖:

pippi6 at 2015-05-27 13:14:14

subroutine DynamicArray

implicit none

real*8, allocatable, dimension( :: sta_info

integer :: i,n=20,j

do i=1,n

allocate(sta_info(i))

do j=1,i

sta_info(j)=j ...

你好,谢谢你,我的这个是只能在这一个循环结束之后才能读出来第二个循环该有多少个数据的,也不能在开始的时候就给他一个大小值啊?你这还是构造一个中间数组用来保存每一个循环的数据,再把这些数据汇总到一个数组里面去,类似于MATLAB里面的矩阵合并C=[a b]?Fortran里面可以这样合并吗?

浔荆

引用回帖:

qingkonggzc at 2015-05-27 19:23:58

你好,谢谢。

首先这样和直接定义一个较大的数组,然后依次把数据/字符串写进去效果应该是一样的吧,就是有多少数据写多少空间的,剩下的还是空的,然后对其进行排序?这个直接把总共有多少数据计算出来,然后对这 ...

对,是一样的。不一样的只是你可以针对非空元素进行操作而已。

假设有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,其中有一位是用于记录字符串有效长度的,有效长度之外全部是空格。

qingkonggzc

引用回帖:

浔荆 at 2015-05-28 08:13:16

对,是一样的。不一样的只是你可以针对非空元素进行操作而已。

假设有n个有效数据,剩余的全是空值。那么,你排序只需要对这n个数据排序就行了,不需要提取出来也不需要中间数组。直接操作部分数组就行。

你 ...

你好,我还是有点不明白只对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)

qingkonggzc

引用回帖:

浔荆 at 2015-05-27 08:19:38

我也常遇到这样的问题,一般我是通过以下方案解决的。

定义一个很大的数组,如sta_info(0:1000)。

之所以定义成sta_info(0:1000)而非sta_info(1:1000),并不是因为我习惯了C语言里的数组默认下标从0开始。实际上, ...

你好,这是我程序里面的一部分,但是这样在第二个循环的时候就会触发断点,这样的话,存储大小会溢出?如果我直接把大小设置为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

linux fortran 大数组,fortran动态数组大小分配问题(allocatable)? - 程序语言 - 小木虫 - 学术 科研 互动社区...相关推荐

  1. matlab读取超大txt文件,fortran如何读取超大文本文件 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    有这样一个外部力的文件,需要每个时间步调用 Fbrk.txt 文件内容如下,第一列是时间 1.07800            13.73559           -16.39831        ...

  2. matlab二重指针,VC++中函数返回数组指针或者带指针的结构体的编译方式是否可取? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    libralibra 构造函数+析构函数应该是比较正规的做法吧, 你的结构体/类被提早释放的问题,是不是那个结构体是局部变量,当超出作用域时对象被销毁,如果存在析构函数,会被默认调用, 如果你返回结构 ...

  3. matlab输入数组换行,三维数组换行输入到文件(intel fortran 编译器) - 程序语言 - 小木虫 - 学术 科研 互动社区...

    我是利用 write(17,300) (r2is(i,j,k),i=1,imax) 300 FORMAT (107E15.6)    !107为imax值 来达到目的的!!!!! 但最后发现,对ima ...

  4. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    %[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...

  5. matlab nml,fortran module 中如何进行赋值计算 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    Fortran代码如下: <pre> module module_name real(8) :: a,b,c contains subroutine initial_ab namelist ...

  6. linux的命令参考手册,Linux常用命令汇总——可当作简要参考手册 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    基础命令 系统分区 #磁盘由盘片.机械手臂.磁头和主轴马达组成,数据写入是在盘片上面.盘片分为扇面.柱面与扇区,扇区只有512bytes大小.磁盘第一个扇区记录了"主引导分区"(可 ...

  7. matlab中并行用不了,请教matlab在linux下的并行问题 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    刚在网上搜了一下,matlabpool open local 8 设置节点数,但是必须在matlab下面才行,比如我打开linux, >>matlab 进入matlab系统,然后matla ...

  8. matlab 读取文件的精度,读取数据文件精度问题!真心求大神赐教 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    程序代码 module typedef type DATE character(len=3) :: Key integer :: L,M real(8) :: C,S end type end mod ...

  9. matlab神经网络拟合后何种参数说明,请教关于BP神经网络参数设置拟合的问题。请大神帮忙看看 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    CODE: %训练变量 xunlianxiangliang=zeros(2,180);%定义一个2行150列的0矩阵:训练变量 xunlianxiangliang(1,=C(1:180); xunli ...

  10. 部分最小二乘回归分析matlab,MATLAB如何用偏最小二乘回归法做预测?跪求大神帮忙 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    CODE: function question_16 %2016-12-26 clear;clc pz=xlsread('C:\Users\cirnotxm\Documents\EGDownloads ...

最新文章

  1. MapReduce TopK统计加排序
  2. 励志:读书七年,为了挣钱,我竭尽全力
  3. 添加icon_Ubuntu下为AppImage应用添加图标并添加到应用
  4. arkit技术介绍_面向移动AR的触觉技术:如何以“触摸”感增强ARKit应用
  5. Leetcode--169. 求众数
  6. 她穿着由自己17封拒稿信做成的裙子,通过了博士论文答辩!
  7. ReactNative入门之android与rn初始化参数的传递
  8. 使用putty连接本地VirtualBox上的centos7 linux主机
  9. kettle-连接控件
  10. PyTorch:模型训练和预测
  11. Nuxt.Js爬坑小记
  12. NetBeans Support Weblog
  13. selenium爬取豆瓣电影和电视剧
  14. java web,添加删除文本框
  15. 读卡器 linux 驱动,基于Linux的公交一卡通读卡器驱动设计
  16. 加什么地形就看什么等高线!等高线实时预览就是这么爽
  17. Grub Rescue恢复
  18. 畅享7 plus android8,华为畅享7和畅享7Plus有什么区别【详细介绍】
  19. jenkins部署的时候WARNING: IPv4 forwarding is disabled. Networking will not work.
  20. 【常见错误 error】Vivado SDK在启动程序时显示cannot stop MicroBlaze.MicroBlaze is held in reset 问题解决办法

热门文章

  1. MySQL集群安装与配置
  2. 19.Linux系统管理
  3. 蓝桥杯 算法提高 一元三次方程求解
  4. 实现RedHat6.3全屏,解决最大分辨率只有800*600
  5. 适合程序员的机器人编程c语言,技术干货六:机器人编程的C++基础知识
  6. Java基础,使用双循环嵌套,实现输出1-1000之间所有的素数,并统计有多少个
  7. Oracle查询成绩高于成绩,oracle认证考试成绩如何查询?
  8. 坦克大战python_基于Python的坦克大战小游戏
  9. 妙启动_十张图带你了解中国国产奶酪巨头——妙可蓝多发展情况
  10. nvm简介与常见命令