Fortran Coder

查看: 5963|回复: 2
打印 上一主题 下一主题

[子程序] 调用f77子程序,里面假定大小的数组在主程序中如何定义

[复制链接]

13

帖子

6

主题

0

精华

熟手

F 币
127 元
贡献
70 点
跳转到指定楼层
楼主
发表于 2020-2-29 18:10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想调用一个f77的子程序,里面有两个数组indexj(*),ivor(*)大小未知,想请问在主程序中如何定义它们的类型?
[Fortran] 纯文本查看 复制代码
   subroutine comsca(iknoel,ipodia,indexj,ivor ,necke,
     &                  nknot ,nelem ,mknpel,laenge,nitot,miwrk)
      implicit double precision(a-h,o-z)
      dimension iknoel(mknpel,nelem),necke(nelem),
     &          ipodia(nknot),indexj(*),ivor(*)

      do i=1,nknot
         ipodia(i)=0
      end do

c Schleife ueber alle Elemente

      ipos=0
      do iel=1,nelem
         ne=necke(iel)

c Doppelschleife (iem,jem) ueber lokale Element-Fhgr., um globale 
c besetzte Positionen (i,j) zu finden
c ipodia(i) : wird als Hilfsfeld benutzt; zeigt auf die Pos. des 
c             zuletzt gefundenen Eintrages der Zeile i
c ivor(ip)  : zeigt auf den vorherigen Eintrag der gleichen Zeile

         do iem=1,ne
            i=iknoel(iem,iel)
            do jem=1,ne
               j=iknoel(jem,iel)
               if(j.gt.i) goto 30
               
c Suche in Zeile i, ob Spalte j schon vorhanden
               
               ip=ipodia(i)
   20          continue
               if(ip.ne.0)then
                  if(indexj(ip).eq.j) goto 30
                  ip=ivor(ip)
                  goto 20
               end if

c neue Spalte fuer Zeile i gefunden

               ipos=ipos+1
               if (ipos+nitot.gt.miwrk) stop'comsto: miwrk vergroessern'
               indexj(ipos)=j
               ivor(ipos)=ipodia(i)
               ipodia(i)=ipos
 30            continue
            end do
         end do
      end do
      laenge=ipos

c indexj am Ende von ivor aufbauen und anschliessend
c nach indexj zurueckkopieren

      do i=1,nknot
         ip=ipodia(i)
         if(ip.eq.0) stop 'Leere Zeile in comsto'

         nj=0
 40      continue
         if(ip.ne.0)then
            nj=nj+1
            ivor(ipos+nj)=indexj(ip)
            ip=ivor(ip) 
            goto 40
         end if

         call iasort(ivor(ipos+1),nj)
         ipos=ipos+nj
         ipodia(i)=ipos-laenge
         if(ivor(ipos).ne.i) stop 'comsto: falsches Diagonalelement'
      end do
      do ip=1,laenge
         indexj(ip)=ivor(ip+laenge)
      end do

      return
      end

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2020-3-1 08:58:42 | 只看该作者
需要多大定义或分配多大。

子程序是为调用者(主程序或其他子程序)服务,而不是调用者为子程序服务。

835

帖子

2

主题

0

精华

大宗师

F 币
3926 元
贡献
2334 点
板凳
发表于 2020-3-1 11:08:41 | 只看该作者
看看<三种数组传递方式>
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-26 18:29

Powered by Tencent X3.4

© 2013-2024 Tencent

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