24小时热门版块排行榜    

查看: 2542  |  回复: 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

至尊木虫 (职业作家)

【答案】应助回帖

★ ★
余泽成(金币+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的回帖

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的回帖

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的回帖

li_clifff

银虫 (正式写手)

引用回帖:
2楼: Originally posted by snoopyzhao at 2011-08-24 11:13:08:
你主程中的 numnp 和 numel 必须赋值,否则必须使用动态数组,那么你的 x, ia, ien, mat, in 等数组就需要用 allocatable 之类的关键词重新声明,然后在调用子程序 sizemesh 之后,用 allocated 来分配内存。

如果在引用call meshsize之前对numnp赋值,或者打开一个文件,读取参数,对numnp赋值,那么是不是就没有问题了呢
6楼2011-09-28 11:02:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

问题是,如果 numnp 没有值,主程序中相关的变量就不能成功声明,所以还是不行……
7楼2011-09-28 11:23:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)

引用回帖:
7楼: Originally posted by snoopyzhao at 2011-09-28 11:23:24:
问题是,如果 numnp 没有值,主程序中相关的变量就不能成功声明,所以还是不行……

恩,明白,那只有include 一个参数文件,如 Include 'Parameters.inc',
把numnp这样的参数 赋值在里面应该可以吧?
8楼2011-09-28 11:40:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

li_clifff

银虫 (正式写手)

我发现早期f77程序,对数组没有动态赋值,都是先定义一个大的数组比如
x(nnpmax),nnpmax在parameter.inc文件里,而实际上子程序里的大小nnp是变化的,但只要不超过nnpmax就行,这样的方式也不错。
9楼2011-09-28 11:46:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

snoopyzhao

至尊木虫 (职业作家)

引用回帖:
8楼: Originally posted by li_clifff at 2011-09-28 11:40:48:
恩,明白,那只有include 一个参数文件,如 Include 'Parameters.inc',
把numnp这样的参数 赋值在里面应该可以吧?

是这样的,呵呵……
10楼2011-09-28 12:34:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 li_clifff 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 一志愿211 初试270分 求调剂 +4 谷雨上岸 2026-03-23 5/250 2026-03-23 21:18 by 不惑可乐
[考研] 265求调剂 +10 梁梁校校 2026-03-17 10/500 2026-03-23 21:17 by 一切OK
[考研] 070300化学求调剂 +8 苑豆豆 2026-03-20 8/400 2026-03-23 20:57 by baobaoye
[基金申请] 请教下大家 2026年国家基金申请是双盲审吗? +3 lishucheng1 2026-03-22 4/200 2026-03-23 20:48 by god_tian
[考研] 316求调剂 +7 梁茜雯 2026-03-19 7/350 2026-03-23 16:21 by lingjue
[考研] 材料与化工考研调剂 +4 孅華 2026-03-22 4/200 2026-03-23 16:13 by 一休哥FU
[考研] 284求调剂 +6 Zhao anqi 2026-03-22 6/300 2026-03-23 09:23 by king123!
[考研] 307求调剂 +11 冷笙123 2026-03-17 11/550 2026-03-22 20:16 by edmund7
[考研] 寻找调剂 +4 倔强芒? 2026-03-21 4/200 2026-03-22 16:14 by 木托莫露露
[考研] 一志愿中南化学(0703)总分337求调剂 +9 niko- 2026-03-19 10/500 2026-03-22 16:08 by ColorlessPI
[考研] 336求调剂 +5 rmc8866 2026-03-21 5/250 2026-03-21 17:24 by 学员8dgXkO
[考研] 346求调剂[0856] +4 WayneLim327 2026-03-16 7/350 2026-03-21 04:02 by JourneyLucky
[考研] 304求调剂 +6 曼殊2266 2026-03-18 6/300 2026-03-21 00:32 by JourneyLucky
[考研] 一志愿西南交大,求调剂 +5 材化逐梦人 2026-03-18 5/250 2026-03-21 00:26 by JourneyLucky
[考研] 296求调剂 +6 www_q 2026-03-18 10/500 2026-03-20 23:56 by JourneyLucky
[考研] 一志愿中海洋材料工程专硕330分求调剂 +8 小材化本科 2026-03-18 8/400 2026-03-20 23:16 by JourneyLucky
[考研] 一志愿武汉理工材料工程专硕调剂 +9 Doleres 2026-03-19 9/450 2026-03-20 22:36 by JourneyLucky
[考研] 290求调剂 +7 ^O^乜 2026-03-19 7/350 2026-03-20 21:43 by JourneyLucky
[考研] 086500 325 求调剂 +3 领带小熊 2026-03-19 3/150 2026-03-20 18:38 by 尽舜尧1
[考研] [导师推荐]西南科技大学国防/材料导师推荐 +3 尖角小荷 2026-03-16 6/300 2026-03-16 23:21 by 尖角小荷
信息提示
请填处理意见