Fortran Coder

查看: 11115|回复: 6
打印 上一主题 下一主题

[子程序] 新手求告知

[复制链接]

14

帖子

5

主题

0

精华

入门

F 币
103 元
贡献
58 点
跳转到指定楼层
楼主
发表于 2018-4-22 21:35:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01MODULE  FUNC
02    TYPE PERSON
03        CHARACTER ( LEN = 10 ) :: NAME
04        REAL :: HEIGHT , WEIGHT
05    END TYPE 
06    TYPE PPERSON
07        TYPE(PERSON) , POINTER :: P
08    END TYPE
09     
10    CONTAINS
11    SUBROUTINE SORT (P)
12    IMPLICIT NONE
13    TYPE(PPERSON) :: P (:)
14    TYPE(PPERSON) :: TEMP
15    INTEGER I,J,S
16    S = SIZE(P,1)
17    DO I = 1 , S-1
18        DO J = I+1 , S
19            IF( P(J)%P%HEIGHT < P(I)%P%HEIGHT ) THEN
20                TEMP = P(I)
21                P(I) = P(J)
22                P(J) = TEMP
23            END IF
24        END DO
25    END DO
26    RETURN
27    END SUBROUTINE
28    END MODULE
29     
30         
31PROGRAM MAIN
32   USE FUNC
33   IMPLICIT NONE
34   TYPE(PERSON) , TARGET :: P(3) = (/PERSON("CHEN" , 180.0 , 56.0 ), &
35                                     PERSON("HUANG", 190.0 , 75.0 ),&
36                                     PERSON("LIU", 177.0 , 89.0 )/)
37   TYPE(PPERSON) :: PT(3)
38   INTEGER I
39   FORALL (I = 1:3)
40       PT(I)%P => P(I)
41   END FORALL
42   CALL SORT(PT)
43   WRITE (*,"(3(A8,F6.1,F5.1/))")( PT(I)%P , I = 1,3)
44     
45   STOP
46END PROGRAM



这里子程序里的,TYPE(PPERSON) :: P (:),为什么可以使用P (:)。
在这里TYPE(PPERSON)并不是个指针,为什么可以使用这种类似可变数组的表达。
而在主程序里TYPE(PPERSON) :: PT(3)就不能使用PT(:)了。

请前辈们看看。
分享到:  微信微信
收藏收藏 点赞点赞1 点踩点踩

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1676 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2018-4-22 22:17:32 | 只看该作者
TYPE(PPERSON) :: P (:) 在子程序里,如果 P 是虚参,则这种用法叫“假定形状”,意思是,实参多大,虚参就多大。

它只能对虚参进行,所以主程序不能使用。

101

帖子

0

主题

0

精华

大师

F 币
670 元
贡献
299 点

规矩勋章元老勋章新人勋章

板凳
发表于 2018-4-23 07:32:53 | 只看该作者
指针的排序为啥要用赋值呢?

  TEMP => P(I)
  P(I) => P(J)
  P(J) => TEMP

指针赋值(=)比指针指向(=>)慢多了
天之道,损有余而补不足

14

帖子

5

主题

0

精华

入门

F 币
103 元
贡献
58 点
地板
 楼主| 发表于 2018-4-23 14:23:21 | 只看该作者
fcode 发表于 2018-4-22 22:17
TYPE(PPERSON) :: P (:) 在子程序里,如果 P 是虚参,则这种用法叫“假定形状”,意思是,实参多大,虚参就 ...

谢谢,懂了

14

帖子

5

主题

0

精华

入门

F 币
103 元
贡献
58 点
5#
 楼主| 发表于 2018-4-23 14:24:14 | 只看该作者
本帖最后由 shaoqikao100 于 2018-4-23 14:50 编辑
胡文刚 发表于 2018-4-23 07:32
指针的排序为啥要用赋值呢?

  TEMP => P(I)

这里的temp和p并不是指针是类,不能用指向的。

101

帖子

0

主题

0

精华

大师

F 币
670 元
贡献
299 点

规矩勋章元老勋章新人勋章

6#
发表于 2018-4-23 15:26:15 | 只看该作者
[Fortran] 纯文本查看 复制代码
1    TYPE(PPERSON) , target  :: P (:)
2    TYPE(PERSON)  , pointer :: TEMP
3 
4TEMP   => P(I)%P
5P(I)%P => P(J)%P
6P(J)%P => TEMP
天之道,损有余而补不足

14

帖子

5

主题

0

精华

入门

F 币
103 元
贡献
58 点
7#
 楼主| 发表于 2018-4-23 16:40:57 | 只看该作者
胡文刚 发表于 2018-4-23 15:26
[mw_shl_code=fortran,true]    TYPE(PPERSON) , target  :: P (:)
    TYPE(PERSON)  , pointer :: TEMP

嗯嗯,这样是可以的
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-5-5 01:15

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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