Fortran Coder

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

[子程序] 新手求告知

[复制链接]

14

帖子

5

主题

0

精华

入门

F 币
103 元
贡献
58 点
跳转到指定楼层
楼主
发表于 2018-4-22 21:35:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
MODULE  FUNC
    TYPE PERSON
        CHARACTER ( LEN = 10 ) :: NAME
        REAL :: HEIGHT , WEIGHT
    END TYPE  
    TYPE PPERSON
        TYPE(PERSON) , POINTER :: P
    END TYPE
    
    CONTAINS
    SUBROUTINE SORT (P)
    IMPLICIT NONE
    TYPE(PPERSON) :: P (:)
    TYPE(PPERSON) :: TEMP
    INTEGER I,J,S
    S = SIZE(P,1)
    DO I = 1 , S-1
        DO J = I+1 , S
            IF( P(J)%P%HEIGHT < P(I)%P%HEIGHT ) THEN
                TEMP = P(I)
                P(I) = P(J)
                P(J) = TEMP
            END IF
        END DO
    END DO
    RETURN
    END SUBROUTINE
    END MODULE
    
        
PROGRAM MAIN
   USE FUNC
   IMPLICIT NONE
   TYPE(PERSON) , TARGET :: P(3) = (/PERSON("CHEN" , 180.0 , 56.0 ), &
                                     PERSON("HUANG", 190.0 , 75.0 ),&
                                     PERSON("LIU", 177.0 , 89.0 )/)
   TYPE(PPERSON) :: PT(3)
   INTEGER I
   FORALL (I = 1:3)
       PT(I)%P => P(I)
   END FORALL
   CALL SORT(PT)
   WRITE (*,"(3(A8,F6.1,F5.1/))")( PT(I)%P , I = 1,3)
    
   STOP
END PROGRAM



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

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

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1642 元
贡献
709 点

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

沙发
发表于 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] 纯文本查看 复制代码
    TYPE(PPERSON) , target  :: P (:)
    TYPE(PERSON)  , pointer :: TEMP

TEMP   => P(I)%P
P(I)%P => P(J)%P
P(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, 2024-12-26 20:28

Powered by Tencent X3.4

© 2013-2024 Tencent

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