Fortran Coder

标题: Ifort18.0或者gfrotran8.1中,定义的参数化派生类型应该如何all... [打印本页]

作者: liudy02    时间: 2018-10-18 12:05
标题: Ifort18.0或者gfrotran8.1中,定义的参数化派生类型应该如何all...
本帖最后由 liudy02 于 2018-10-18 21:01 编辑

例如定义了一个参数化派生类型:
Type :: PMat(k,n)
    INTEGER(KIND=4),KIND :: k
    INTEGER(KIND=4),LEN :: n
    REAL(KIND=k) :: M(n,n)
End Type

然后在声明的时候声明成 LEN 型参数n不定的
Type(PMat(8,:)),Allocatable :: A
但是后面怎么给A Allocate呢……

汗,才发现最开始的帖子里写的有误……

作者: vvt    时间: 2018-10-18 19:14
Type :: PMat(k)
    INTEGER(KIND=4),KIND :: k
    REAL(KIND=8) , allocatable :: M(:,:)
End Type
Type(PMat(8)) :: A
allocate( A%m(3,3) )
作者: li913    时间: 2018-10-18 19:16
本帖最后由 li913 于 2018-10-18 19:21 编辑

我用ivf17.0, 这个功能好像还不健全。
[Fortran] 纯文本查看 复制代码
program test
type matrix(kind,n)
    integer, kind :: kind=kind(0.0d0)! gives a default value
    integer, len :: n ! no default value given
    real(kind) :: arr(n)
end type
type(matrix(kind=kind(0.0),n=2)) :: a
type(matrix(4,:)),allocatable :: b
a%arr = [1,2]
b=a
print*,b
a%arr = [3,4]
print*,b
pause
end program

1.png (35.09 KB, 下载次数: 288)

1.png

作者: liudy02    时间: 2018-10-18 20:56
vvt 发表于 2018-10-18 19:14
Type :: PMat(k)
    INTEGER(KIND=4),KIND :: k
    REAL(KIND=8) , allocatable :: M(:,:)

谢谢大神的回复
您的意思是直接放弃派生类型的LEN型参数,而是用不定结构数组或者指针来实现同样的功能?
这样似乎也是可以,不过那为啥Fortran2003标准中加上这样的功能……
作者: liudy02    时间: 2018-10-18 20:59
li913 发表于 2018-10-18 19:16
我用ivf17.0, 这个功能好像还不健全。[mw_shl_code=fortran,true]program test
type matrix(kind,n)
    in ...

从效果上来看,b实际上就是一个指针啊……
看来编译器实际上就是用这样的方法实现Fortran2003里的LEN型参数功能的,可是感觉不太对
看来是现在的编译器都还没有真正实现这种功能……
作者: vvt    时间: 2018-10-19 08:50
liudy02 发表于 2018-10-18 20:56
谢谢大神的回复
您的意思是直接放弃派生类型的LEN型参数,而是用不定结构数组或者指针来实现同样的功能? ...

我是觉得可分配数组比 Integer , len 更灵活。

type(matrix(kind=4,n=2)) :: a(100)

这100个 a(i) 都是 n=2

而用可分配数组的话,每个 a(i) 的 n 还可以不一样。岂不是更美妙?

作者: liudy02    时间: 2018-10-19 09:42
vvt 发表于 2018-10-19 08:50
我是觉得可分配数组比 Integer , len 更灵活。

type(matrix(kind=4,n=2)) :: a(100)

噗,大神,如果从这个角度的话,那不还是要为这100个派生类型数据分配嘛
这就看实际有没有这种需求了,您这个确实也是个思路
不过还是不能解决我的疑惑:
1.如果把有LEN型参数的派生类型声明成Allocatable的,后续应该怎么allocate
2.既然按您的思路,可分配数组或者指针可以完全代替LEN型参数的功能,Fortran2003标准增加这个干嘛……
作者: li913    时间: 2018-10-19 10:29
标准虽然提出来了,但是对编译器厂商而言:1、不一定能够实现;2、可选择性实现某些功能;3、暂时没有实现。
作者: liudy02    时间: 2018-10-19 16:16
li913 发表于 2018-10-19 10:29
标准虽然提出来了,但是对编译器厂商而言:1、不一定能够实现;2、可选择性实现某些功能;3、暂时没有实现 ...

您说的对啊,编译器和标准不是一回事
我原以为在IVF和GCC的说明上都说了实现参数化派生类型就说明标准上的这功能已经完整了
但是实际上还是不是一回事啊
不过可分配数组和指针可以实现完全一样的功能,倒也不必纠结……




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