爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5316|回复: 17

[求助] 动态数组继续赋值问题

[复制链接]

新浪微博达人勋

发表于 2014-8-10 10:21:53 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
一个动态数组 a ,开始分配内存 allocate(a(128))
之后为a赋值,如果超过了128个,继续给a 分配128,也就是a变成 a(256),之前的赋值也保存

这样可以实现吗?

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-10 10:39:12 | 显示全部楼层
按楼主的说法来看 楼主已经先确定了算法 算法肯定能实现 只是看怎么编程和程序的效率高不高而已 如果你把数据形式拿来看看 说不定有更多的算法告诉你
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-10 10:50:01 | 显示全部楼层
Mid_Farmer 发表于 2014-8-10 10:39
按楼主的说法来看 楼主已经先确定了算法 算法肯定能实现 只是看怎么编程和程序的效率高不高而已 如果你把数 ...

可以实现是吗?你指的数据形式是?

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-10 11:22:39 | 显示全部楼层
声明的时候就是a(:)这种的,没有128,你都要开始赋值了你还不知道数组维数?应该可以用某种方式确定要赋值的数是否是超过128的,要是超过就直接allocate(a(256))就好了。你论述的那种方式fortran实现感觉是不是要转存一个变量~因为上面你已经用allocate声明过了,重新改维数不知道行不行。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-10 14:25:59 | 显示全部楼层
斥鷃 发表于 2014-8-10 11:22
声明的时候就是a(:)这种的,没有128,你都要开始赋值了你还不知道数组维数?应该可以用某种方式确定要赋值 ...

提前是多少不知道,是一边计算一边赋值,超了128再扩展数组的范围,维数知道,是否超过256也不确定,超过了继续扩,所以直接allocate(a(256))不能解决问题
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-10 15:47:37 | 显示全部楼层
你计算的东西贴上来,才好想法子确定维数,要是计算不复杂的话让它算一遍,记一下数,然后再重定义变量,再算一遍赋值,你的计算是写在while循环里面?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-10 20:49:11 | 显示全部楼层
快乐枫 发表于 2014-8-10 10:50
可以实现是吗?你指的数据形式是?

你还是贴数据吧 楼上的说得很清楚了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-11 08:46:48 | 显示全部楼层
学以致用
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2014-8-11 08:53:09 | 显示全部楼层
快乐枫 发表于 2014-8-10 14:25
提前是多少不知道,是一边计算一边赋值,超了128再扩展数组的范围,维数知道,是否超过256也不确定,超过 ...

用指针和链表啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-11 09:39:34 | 显示全部楼层
斥鷃 发表于 2014-8-10 15:47
你计算的东西贴上来,才好想法子确定维数,要是计算不复杂的话让它算一遍,记一下数,然后再重定义变量,再 ...

是用的while循环,如下,在update the solution部分,是每循环一步,更新一下Z 和Y 的数据,提前给Z和Y一个范围,用if判断n 大于它们的维数了,如果超了,再往后扩展,不知如何实现。

因为不止这一个地方用,先记一下数再重新算一遍的方法不太可取,不知道 有没有直接解决它的方法呢

do while((t<tfinal).and.(t+h>t))
   
    if(t+h>tfinal)then

      h=tfinal-t

    end if

!----------------------------------------------------------------------!
! Compute the slopes

    call iceocean(t,y1,temp)
    f(:,1)=temp

    do j=1,5
      
      call iceocean(t+alpha(j)*h,y1+matmul(h*f,beta(:,j)),temp)
      f(:,j+1)=temp
   
    end do

!----------------------------------------------------------------------!
! Estimate the error and the acceptable error

    delta=sqrt(maxval(matmul(h*f,gama(:,2))*matmul(h*f,gama(:,2))))
    tau=tol*max(sqrt(maxval(y1*y1)),1.0)

!----------------------------------------------------------------------!
! Update the solution only if the error is acceptable

    if(delta<=tau)then

      t=t+h
      y1=y1+h*matmul(f,gama(:,1))
      call iceocean(t,y1,temp)
      n=n+1

      if(n>size(Z))
          ?
      end if

      Z(n)=t
      Y(n,:)=y1

    end if

    if(delta/=0.0)then

      h=min(hmax, 0.8*h*(tau/delta)**pow)

    end if

!----------------------------------------------------------------------!
! end the main loop

  end do
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表