Fortran Coder

查看: 82|回复: 8

[派生类型] Ifort18.0或者gfrotran8.1中,定义的参数化派生类型应该如何all...

[复制链接]

21

帖子

3

主题

0

精华

熟手

F 币
119 元
贡献
63 点
发表于 2018-10-18 12:05:02 | 显示全部楼层 |阅读模式
本帖最后由 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呢……

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

使用道具 举报

586

帖子

0

主题

0

精华

大师

F 币
483 元
贡献
305 点

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

QQ
发表于 2018-10-18 19:14:04 | 显示全部楼层
Type :: PMat(k)
    INTEGER(KIND=4),KIND :: k
    REAL(KIND=8) , allocatable :: M(:,:)
End Type
Type(PMat(8)) :: A
allocate( A%m(3,3) )

272

帖子

1

主题

0

精华

宗师

F 币
1521 元
贡献
1024 点
发表于 2018-10-18 19:16:09 | 显示全部楼层
本帖最后由 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

21

帖子

3

主题

0

精华

熟手

F 币
119 元
贡献
63 点
 楼主| 发表于 2018-10-18 20:56:46 | 显示全部楼层
vvt 发表于 2018-10-18 19:14
Type :: PMat(k)
    INTEGER(KIND=4),KIND :: k
    REAL(KIND=8) , allocatable :: M(:,:)

谢谢大神的回复
您的意思是直接放弃派生类型的LEN型参数,而是用不定结构数组或者指针来实现同样的功能?
这样似乎也是可以,不过那为啥Fortran2003标准中加上这样的功能……

21

帖子

3

主题

0

精华

熟手

F 币
119 元
贡献
63 点
 楼主| 发表于 2018-10-18 20:59:42 | 显示全部楼层
li913 发表于 2018-10-18 19:16
我用ivf17.0, 这个功能好像还不健全。[mw_shl_code=fortran,true]program test
type matrix(kind,n)
    in ...

从效果上来看,b实际上就是一个指针啊……
看来编译器实际上就是用这样的方法实现Fortran2003里的LEN型参数功能的,可是感觉不太对
看来是现在的编译器都还没有真正实现这种功能……

586

帖子

0

主题

0

精华

大师

F 币
483 元
贡献
305 点

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

QQ
发表于 2018-10-19 08:50:25 | 显示全部楼层
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 还可以不一样。岂不是更美妙?

21

帖子

3

主题

0

精华

熟手

F 币
119 元
贡献
63 点
 楼主| 发表于 2018-10-19 09:42:58 | 显示全部楼层
vvt 发表于 2018-10-19 08:50
我是觉得可分配数组比 Integer , len 更灵活。

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

噗,大神,如果从这个角度的话,那不还是要为这100个派生类型数据分配嘛
这就看实际有没有这种需求了,您这个确实也是个思路
不过还是不能解决我的疑惑:
1.如果把有LEN型参数的派生类型声明成Allocatable的,后续应该怎么allocate
2.既然按您的思路,可分配数组或者指针可以完全代替LEN型参数的功能,Fortran2003标准增加这个干嘛……

272

帖子

1

主题

0

精华

宗师

F 币
1521 元
贡献
1024 点
发表于 2018-10-19 10:29:25 | 显示全部楼层
标准虽然提出来了,但是对编译器厂商而言:1、不一定能够实现;2、可选择性实现某些功能;3、暂时没有实现。

21

帖子

3

主题

0

精华

熟手

F 币
119 元
贡献
63 点
 楼主| 发表于 2018-10-19 16:16:15 | 显示全部楼层
li913 发表于 2018-10-19 10:29
标准虽然提出来了,但是对编译器厂商而言:1、不一定能够实现;2、可选择性实现某些功能;3、暂时没有实现 ...

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

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2018-11-14 07:12

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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