Fortran Coder

查看: 4643|回复: 12
打印 上一主题 下一主题

[派生类型] 函数传入和返回值均为包含动态数组的type

[复制链接]

16

帖子

7

主题

0

精华

入门

F 币
66 元
贡献
36 点
跳转到指定楼层
楼主
发表于 2022-6-1 16:59:14 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
因为程序很大,简化之后的程序如下所示。原程序是采用ifortran采用参数化结构体编写,因为想对程序实现GPU并行,所以采用gfortran12.x编写。哪位大佬帮忙解答一下哪错了
[Fortran] 纯文本查看 复制代码
module ModParticle
  implicit none
  integer::x=4
  type ParticleType
    real(4) , allocatable :: MassGas(:)
  contains
    Procedure :: CopyParticle => CopyParticle

  end type
contains ! Routines of this module

  Subroutine CopyParticle( this , ID )
    integer(4), intent(in) ::  ID
    class(ParticleType) :: this
    this%MassGas = 0.1
  End Subroutine CopyParticle

  subroutine CopyType(TempParticlesx,TempParticles)
    type(ParticleType)::TempParticles
    type(ParticleType)::TempParticlesx
    allocate(TempParticles%MassGas(x))
      TempParticlesx%MassGas = TempParticles%MassGas
    deallocate(TempParticles%MassGas)
  end subroutine

end module

[Fortran] 纯文本查看 复制代码
PROGRAM Main
  use ModParticle
  implicit none

  integer::i
  type(ParticleType)::TempParticles
  type(ParticleType)::TempParticlesx
  allocate(TempParticles%MassGas(x))
  do i = 1, size(TempParticles%MassGas)
    call TempParticles%CopyParticle(i)
  end do
  write(*,*) TempParticles%MassGas

call CopyType(TempParticlesx,TempParticles)

write(*,*) TempParticlesx%MassGas
deallocate(TempParticles%MassGas)

END PROGRAM Main

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

13#
发表于 2022-6-27 08:07:32 | 只看该作者
phost 发表于 2022-6-26 23:35
两次contain,一个是Fortran的03的新功能,派生类型的函数,类似c++,c#的class了。
不过感觉Fortran搞面向 ...

话可不是这么说的。
能不能搞得过,是一回事。有没有,是另一回事。

毕竟,你要想借用Fortran的数值计算,又想要type过程捆绑。你不能简单方便的把C++/C的class特性拿过来用。是吧?
(不要提混编,混编的细粒度还不够)

我一直在用F2003的新特性,type捆绑过程,甚至抽象过程等等。且说和其他语言比较,还稍显稚嫩。但的确是对Fortran语法的重大补充。

恰如一台手机,他可以专注于摄像、专注于性能、专注于音乐。那么,它的屏幕可以差一些,但没有屏幕,那就是另外一回事了,对吧?

15

帖子

6

主题

0

精华

熟手

F 币
171 元
贡献
72 点
12#
发表于 2022-6-26 23:35:46 | 只看该作者
两次contain,一个是Fortran的03的新功能,派生类型的函数,类似c++,c#的class了。
不过感觉Fortran搞面向对象还是走入歧途,怎么搞也不可能搞过c#和java
还不如就加强数值计算功能得了

16

帖子

7

主题

0

精华

入门

F 币
66 元
贡献
36 点
11#
 楼主| 发表于 2022-6-25 15:27:15 | 只看该作者
accding 发表于 2022-6-17 12:22
module里面,为何用两次contains?

其中一个是在派生type中的

2

帖子

1

主题

0

精华

新人

F 币
23 元
贡献
10 点
10#
发表于 2022-6-17 12:22:33 | 只看该作者
module里面,为何用两次contains?

16

帖子

7

主题

0

精华

入门

F 币
66 元
贡献
36 点
9#
 楼主| 发表于 2022-6-4 16:28:58 | 只看该作者
zjk0112 发表于 2022-6-3 23:03
有时报错,有时正常?依我的经验,是不是初始化的问题。

好的,谢谢你的建议,我根据你的建议再看看。确实是有时报错,有时正常。

44

帖子

4

主题

0

精华

熟手

F 币
179 元
贡献
90 点
8#
发表于 2022-6-3 23:03:03 | 只看该作者
Neo123 发表于 2022-6-2 22:13
我自己测试发现同一个程序codeblocks所带的旧版本的gfortran版本经常提示报错,有时会正常编译,但最新的 ...

有时报错,有时正常?依我的经验,是不是初始化的问题。

16

帖子

7

主题

0

精华

入门

F 币
66 元
贡献
36 点
7#
 楼主| 发表于 2022-6-2 22:13:26 | 只看该作者
zjk0112 发表于 2022-6-2 18:10
你要不把你测试报错的最简单程序发出来,我可以在我电脑上帮你测试一下是不是gfortran,或者gfortran版本 ...

我自己测试发现同一个程序codeblocks所带的旧版本的gfortran版本经常提示报错,有时会正常编译,但最新的gfortran 12.1是没有问题的

44

帖子

4

主题

0

精华

熟手

F 币
179 元
贡献
90 点
6#
发表于 2022-6-2 18:10:02 | 只看该作者
Neo123 发表于 2022-6-2 13:38
你看到的“风平老涡”的帖子是后来修改的,之前的内容是说我没定义x。
将ModParticle中的allocate删除后 ...

你要不把你测试报错的最简单程序发出来,我可以在我电脑上帮你测试一下是不是gfortran,或者gfortran版本的问题。

16

帖子

7

主题

0

精华

入门

F 币
66 元
贡献
36 点
5#
 楼主| 发表于 2022-6-2 13:38:32 | 只看该作者
kyra 发表于 2022-6-2 10:31
这就是问题所在。
重复分配了。一个可分配数组只能分配一次,要第二次分配必须先 Deallocate 释放。

你看到的“风平老涡”的帖子是后来修改的,之前的内容是说我没定义x。
将ModParticle中的allocate删除后,可以在ifortran和gpfortran中正常编译,但是我在gfortran中还是报错undefined reference to ‘CopyType_’

打这些字的时候感觉是gfortran编译器的问题,刚才连之前用gfortran测试过的最简单的程序也都莫名奇妙报错,但吃个饭以后再用gfortran编译程序都可以正常编译了,不太明白是电脑问题还是软件问题
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-6 20:33

Powered by Tencent X3.4

© 2013-2024 Tencent

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