Fortran Coder

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

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

[复制链接]

13

帖子

6

主题

0

精华

熟手

F 币
127 元
贡献
70 点
跳转到指定楼层
楼主
发表于 2020-2-29 18:10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想调用一个f77的子程序,里面有两个数组indexj(*),ivor(*)大小未知,想请问在主程序中如何定义它们的类型?
[Fortran] 纯文本查看 复制代码
01   subroutine comsca(iknoel,ipodia,indexj,ivor ,necke,
02     &                  nknot ,nelem ,mknpel,laenge,nitot,miwrk)
03      implicit double precision(a-h,o-z)
04      dimension iknoel(mknpel,nelem),necke(nelem),
05     &          ipodia(nknot),indexj(*),ivor(*)
06 
07      do i=1,nknot
08         ipodia(i)=0
09      end do
10 
11c Schleife ueber alle Elemente
12 
13      ipos=0
14      do iel=1,nelem
15         ne=necke(iel)
16 
17c Doppelschleife (iem,jem) ueber lokale Element-Fhgr., um globale
18c besetzte Positionen (i,j) zu finden
19c ipodia(i) : wird als Hilfsfeld benutzt; zeigt auf die Pos. des
20c             zuletzt gefundenen Eintrages der Zeile i
21c ivor(ip)  : zeigt auf den vorherigen Eintrag der gleichen Zeile
22 
23         do iem=1,ne
24            i=iknoel(iem,iel)
25            do jem=1,ne
26               j=iknoel(jem,iel)
27               if(j.gt.i) goto 30
28                
29c Suche in Zeile i, ob Spalte j schon vorhanden
30                
31               ip=ipodia(i)
32   20          continue
33               if(ip.ne.0)then
34                  if(indexj(ip).eq.j) goto 30
35                  ip=ivor(ip)
36                  goto 20
37               end if
38 
39c neue Spalte fuer Zeile i gefunden
40 
41               ipos=ipos+1
42               if (ipos+nitot.gt.miwrk) stop'comsto: miwrk vergroessern'
43               indexj(ipos)=j
44               ivor(ipos)=ipodia(i)
45               ipodia(i)=ipos
46 30            continue
47            end do
48         end do
49      end do
50      laenge=ipos
51 
52c indexj am Ende von ivor aufbauen und anschliessend
53c nach indexj zurueckkopieren
54 
55      do i=1,nknot
56         ip=ipodia(i)
57         if(ip.eq.0) stop 'Leere Zeile in comsto'
58 
59         nj=0
60 40      continue
61         if(ip.ne.0)then
62            nj=nj+1
63            ivor(ipos+nj)=indexj(ip)
64            ip=ivor(ip)
65            goto 40
66         end if
67 
68         call iasort(ivor(ipos+1),nj)
69         ipos=ipos+nj
70         ipodia(i)=ipos-laenge
71         if(ivor(ipos).ne.i) stop 'comsto: falsches Diagonalelement'
72      end do
73      do ip=1,laenge
74         indexj(ip)=ivor(ip+laenge)
75      end do
76 
77      return
78      end

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

955

帖子

0

主题

0

精华

大师

F 币
188 元
贡献
77 点

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

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

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

838

帖子

2

主题

0

精华

大宗师

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

本版积分规则

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

GMT+8, 2025-5-4 02:41

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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