shaoqikao100 发表于 2018-4-22 21:35:42

新手求告知

MODULEFUNC
    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:32

TYPE(PPERSON) :: P (:) 在子程序里,如果 P 是虚参,则这种用法叫“假定形状”,意思是,实参多大,虚参就多大。

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

胡文刚 发表于 2018-4-23 07:32:53

指针的排序为啥要用赋值呢?

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

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

shaoqikao100 发表于 2018-4-23 14:23:21

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

谢谢,懂了

shaoqikao100 发表于 2018-4-23 14:24:14

本帖最后由 shaoqikao100 于 2018-4-23 14:50 编辑

胡文刚 发表于 2018-4-23 07:32
指针的排序为啥要用赋值呢?

TEMP => P(I)

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

胡文刚 发表于 2018-4-23 15:26:15

    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:57

胡文刚 发表于 2018-4-23 15:26
    TYPE(PPERSON) , target:: P (:)
    TYPE(PERSON), pointer :: TEMP



嗯嗯,这样是可以的
页: [1]
查看完整版本: 新手求告知