Fortran Coder

查看: 9072|回复: 8
打印 上一主题 下一主题

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

[复制链接]

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
跳转到指定楼层
楼主
发表于 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呢……

汗,才发现最开始的帖子里写的有误……
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

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) )

798

帖子

2

主题

0

精华

大宗师

F 币
3793 元
贡献
2268 点
板凳
发表于 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 (35.09 KB, 下载次数: 288)

1.png

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
地板
 楼主| 发表于 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标准中加上这样的功能……

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
5#
 楼主| 发表于 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型参数功能的,可是感觉不太对
看来是现在的编译器都还没有真正实现这种功能……

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

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

QQ
6#
发表于 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 还可以不一样。岂不是更美妙?

178

帖子

15

主题

0

精华

大宗师

F 币
4973 元
贡献
1152 点
7#
 楼主| 发表于 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标准增加这个干嘛……

798

帖子

2

主题

0

精华

大宗师

F 币
3793 元
贡献
2268 点
8#
发表于 2018-10-19 10:29:25 | 只看该作者
标准虽然提出来了,但是对编译器厂商而言:1、不一定能够实现;2、可选择性实现某些功能;3、暂时没有实现。

178

帖子

15

主题

0

精华

大宗师

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

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-26 04:11

Powered by Tencent X3.4

© 2013-2024 Tencent

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