回 帖 发 新 帖 刷新版面

主题:现在fortran可否实现typealias功能

有的子程序 实数,整数,和复数  都是一样的,
只是程序的变量类型不一样,是否有类似typealias的功能,

如何实现?


下面是typealias的例子,但编译器还没实现这个功能,是否有代替的功能?

  1 subroutine sort(IOa, INMax)
  2 type(atype), dimension(:), intent(inout):: IOa
  3 integer, intent(in):: INMax
  4 type(atype):: temp
  5 integer:: ii, jj, mini
  6 
  7 do ii = 1, INmax - 1
  8 mini = ii
  9 do jj = ii + 1, INMax
 10 if (IOa(mini) .gt. IOa(jj)) mini = jj
 11 end do
 12 
 13 if (mini .ne. ii) then
 14 temp = IOa(ii)
 15 IOa(ii) = IOa(mini)
 16 IOa(mini) = temp
 17 end if
 18 end do
 19 return
 20 end subroutine



  1 module ModReal
  2 typealias:: atype=>real
  3 contains
  4 include 'sorta.inc'
  5 end module
  6 
  7 module ModInt
  8 typealias:: atype=>integer
  9 contains
 10 include 'sorta.inc'
 11 end module
 12 
 13 program main
 14 use ModReal, only: sortreal=>sort
 15 use ModInt,  only: sortint=>sort
 16 integer, parameter:: MAXAA = 10
 17 real, dimension(MAXAA):: ar
 18 integer, dimension (MAXAA):: ai
 19 integer:: ii
 20 
 21 ar = (/ 7., 4., 1., 8., 5., 2., 9., 6., 3., 0. /)
 22 ai = (/ 3, 6, 9, 2, 5, 8, 1, 4, 7, 0/)
 23 
 24 print '(A,10I7)', 'before', (ai(ii), ii = 1, MAXAA)
 25 call sortint(ai, MAXAA)
 26 print '(A,10I7)', 'after ', (ai(ii), ii = 1,
 27 MAXAA)
 28 print '(A,10F7.2)', 'before', (ar(ii), ii
 29 = 1, MAXAA)
 30 call sortreal(ar, MAXAA)
 31 print '(A,10F7.2)', 'after ', (ar(ii), ii = 1, MAXAA)
 32 stop
 33 end

回复列表 (共2个回复)

沙发

现在暂时只能使用interface来重载

板凳

您说的,在 C++ 语言中,应该是 Fucntion Template,这个应该是面向对象的语言,但目前的 Fortran2003/2008 并不支持。个人猜想其原因是:Fortran 主要是进行数值计算,就拿一个数值函数 sin 来说吧,似乎我们也可以用 Function Template 来定义它,在 C++ 语言中,我们经常拿它来示意 Function Template。那从数值计算的角度,这个是不正确的,因为--精度。不同的精度需要不同的算法,在程序编写上也有很大的不同,因此,用 Function Template 无法实现。当然,对某些情况,比如排序,可以引入 Function Template 的概念,也许在将来的某个时候,会引入;但我想,这个应该不会是 Fortran 语言标准的侧重点。
个人意见。

我来回复

您尚未登录,请登录后再回复。点此登录或注册