Fortran Coder

标题: 新手求告知 [打印本页]

作者: shaoqikao100    时间: 2018-4-22 21:35
标题: 新手求告知
[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(:)了。

请前辈们看看。

作者: fcode    时间: 2018-4-22 22:17
TYPE(PPERSON) :: P (:) 在子程序里,如果 P 是虚参,则这种用法叫“假定形状”,意思是,实参多大,虚参就多大。

它只能对虚参进行,所以主程序不能使用。
作者: 胡文刚    时间: 2018-4-23 07:32
指针的排序为啥要用赋值呢?

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

指针赋值(=)比指针指向(=>)慢多了

作者: shaoqikao100    时间: 2018-4-23 14:23
fcode 发表于 2018-4-22 22:17
TYPE(PPERSON) :: P (:) 在子程序里,如果 P 是虚参,则这种用法叫“假定形状”,意思是,实参多大,虚参就 ...

谢谢,懂了
作者: shaoqikao100    时间: 2018-4-23 14:24
本帖最后由 shaoqikao100 于 2018-4-23 14:50 编辑
胡文刚 发表于 2018-4-23 07:32
指针的排序为啥要用赋值呢?

  TEMP => P(I)

这里的temp和p并不是指针是类,不能用指向的。
作者: 胡文刚    时间: 2018-4-23 15:26
[Fortran] 纯文本查看 复制代码
    TYPE(PPERSON) , target  :: P (:)
    TYPE(PERSON)  , pointer :: TEMP

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

作者: shaoqikao100    时间: 2018-4-23 16:40
胡文刚 发表于 2018-4-23 15:26
[mw_shl_code=fortran,true]    TYPE(PPERSON) , target  :: P (:)
    TYPE(PERSON)  , pointer :: TEMP

嗯嗯,这样是可以的




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2