24小时热门版块排行榜    

查看: 2403  |  回复: 9
本帖产生 1 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

li_clifff

银虫 (正式写手)

[求助] 请教一个fortran小程序编译出错的问题,谢谢

如下程序编译不成功,不知道问题出在哪里,mesh.dat文件格式是第一行是numnp, numel的数值,第二行到最后是mesh的各个四边形的具体坐标。错误信息是:Error: A specification expression object must be a dummy argument, a COMMON block object, or an object accessible through host or use association   [NUMNP]  integer*4 numnp, numel   
还有G:\Program Files\Microsoft Visual Studio\MyProjects\mesh\pmesh.for(22) : Error: An automatic object is invalid in a main program.   [X] dimension x(2,numnp),ia(numnp),请多多指教,谢谢                        


  PROGRAM pmesh
c
c-----------------------------------------------------------------
c     purpose : to eliminate the string from existed mesh data
c               warning : the mesh has to be made out of quadrangles only
c     in :c
c     out :
c             x     : array containing node coordinates
c             ia    : nodes reference number
c             ien   : list of element nodes
c             mat   : material ref. numbers for all elements
c             in    : element sides ref. number
cc-----------------------------------------------------------------------
c
      implicit real*8 (a-h,o-z)
      real xreal,yreal
      integer*4 numnp, numel                           
      dimension x(2,numnp),ia(numnp)
      dimension ien(4,numel),mat(numel),in(4,numel)
   
      open(57,file='pmesh1.dat')
      open(58,file='pmesh2.dat')
      
         call sizemesh(numnp, numel)
         open(21,file='mesh.dat')
          read(21,*)
          do 300 i=1,numnp                   
          read(21,2100)idum,xreal,yreal,ia(i)
              x(1,i) = xreal
              x(2,i) = yreal
          write(57,*)idum,xreal,yreal,ia(i)
300    continue
          do 500 n=1,numel
          read(21,2300)ndum,(ien(i,n),i=1,4),(in(i,n),i=1,4)
          write(58,*)ndum,(ien(i,n),i=1,4),(in(i,n),i=1,4)
500    continue
          close(21)

2100  format(i5,2x,e15.5,2x,e12.5,2x,i2)
2300  format(5(i5,2x),4(i2,2x))
          end
c**************************************************************


     subroutine sizemesh(numnp,numel)

        integer numnp, numel

      open(21,file='mesh.dat')
      read(21,*) numnp,numel
     close(21)
     return
     end
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★
li_clifff(金币+20): 确实是这样,动态数组,学习了,谢谢 2011-08-24 11:36:10
余泽成(金币+3): 辛苦了! 2011-08-24 16:27:14
dubo(金币+5, 程序强帖+1): 多谢应猪 2011-08-27 16:42:39
ben_ladeng: 专家考核存档 2011-09-28 11:40:00
上面错了一点儿,不是用 allocated,而是用 allocate 来分配内存。下面是修改后的程序:
CODE:
      PROGRAM pmesh
c
c-----------------------------------------------------------------
c     purpose : to eliminate the string from existed mesh data
c               warning : the mesh has to be made out of quadrangles only
c     in :c
c     out :
c             x     : array containing node coordinates
c             ia    : nodes reference number
c             ien   : list of element nodes
c             mat   : material ref. numbers for all elements
c             in    : element sides ref. number
cc-----------------------------------------------------------------------
c
      implicit real*8 (a-h,o-z)
      real xreal,yreal
      integer*4 numnp, numel                           
      real, allocatable :: x(:,:)
      integer*4, allocatable :: ien(:,:), ia(:), mat(:), in(:,:)
!     dimension x(2,numnp),ia(numnp)
!     dimension ien(4,numel),mat(numel),in(4,numel)
   
      open(57,file='pmesh1.dat')
      open(58,file='pmesh2.dat')
      
         call sizemesh(numnp, numel)
         allocate(x(2,numnp),ia(numnp),ien(4,numel),mat(numel),
     +             in(4,numel))
         open(21,file='mesh.dat')
          read(21,*)
          do 300 i=1,numnp                  
          read(21,2100)idum,xreal,yreal,ia(i)
              x(1,i) = xreal
              x(2,i) = yreal
          write(57,*)idum,xreal,yreal,ia(i)
300    continue
          do 500 n=1,numel
          read(21,2300)ndum,(ien(i,n),i=1,4),(in(i,n),i=1,4)
          write(58,*)ndum,(ien(i,n),i=1,4),(in(i,n),i=1,4)
500    continue
          close(21)

2100  format(i5,2x,e15.5,2x,e12.5,2x,i2)
2300  format(5(i5,2x),4(i2,2x))
          end
c**************************************************************


      subroutine sizemesh(numnp,numel)

        integer numnp, numel

      open(21,file='mesh.dat')
      read(21,*) numnp,numel
      close(21)
      return
      end

3楼2011-08-24 11:26:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 10 个回答

snoopyzhao

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
余泽成(金币+2): 谢谢参与应助! 2011-08-24 16:26:52
ben_ladeng: 专家考核存档 2011-09-28 11:39:50
你主程中的 numnp 和 numel 必须赋值,否则必须使用动态数组,那么你的 x, ia, ien, mat, in 等数组就需要用 allocatable 之类的关键词重新声明,然后在调用子程序 sizemesh 之后,用 allocated 来分配内存。
2楼2011-08-24 11:13:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)


dubo(金币+1): 欢迎讨论 2011-08-27 16:41:30
但是我真看到有的f77程序主程序不用allocatable,直接调用子程序生成的numnp, numel就可以,就是按我那样开始写的,不知道自己按那样的方式怎么行不通了
4楼2011-08-24 12:53:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

★ ★
余泽成(金币+1): 谢谢参与应助! 2011-08-24 16:27:27
dubo(金币+1): 欢迎讨论 2011-08-27 16:41:43
ben_ladeng: 专家考核存档 2011-09-28 11:40:16
引用回帖:
4楼: Originally posted by li_clifff at 2011-08-24 12:53:08:
但是我真看到有的f77程序主程序不用allocatable,直接调用子程序生成的numnp, numel就可以,就是按我那样开始写的,不知道自己按那样的方式怎么行不通了

在主程序中不行,在子程序中有可能可行,但不是你这种写法……

也就是说,如果声明变量时,numnp, numel 有值就行,否则不行……
5楼2011-08-24 14:53:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见