回 帖 发 新 帖 刷新版面

主题:[讨论]foran中可否定义一个标号代替某种类型定义

请教:
fortran 中可否定义一个标号代替某种类型定义如:
定义complex1 代替 类型定义 complex*8,这样在程序中定义某个变量时可以用:
complex1 :: a
complex1 :: b
来代替:
complex*8 :: a
complex*8 :: b

希望可以这样做的原因是当我要改变a,b的类型时,我不用一个个地去改变没处定义只需要将complex1重新定义,如
定义complex1 代表 complex*16,等等

想请问哪位能否帮忙解答谢谢![em10]

回复列表 (共7个回复)

沙发

如果都是 complex ,只是精度不同。则可以用下面的代码(类似,你稍微改改)

[quote]Program MyKind
  implicit none
  Integer , parameter :: MyKind = 4 !// 将来修改此处为 8 既可改为双精度
  Real( Kind = MyKind ) :: c1 , c2
  c1 = 4.0_MyKind
  c2 = 5.0_MyKind
  write( * , * ) c1 , c2
End Program MyKind[/quote]

如果你希望把 real 在将来改成 integer 这样的,恐怕就要用 Type_Alias 了。

这是一个较新的语法,我不确定你的编译器支持它。

[quote]Program Type_Alias_Exp
  implicit none
  Type_Alias :: DataKind => Real !//将来修改此处为 Real*8
  Type( DataKind ) :: dkA , dkB
  Real :: rA
  dkA = 3.14
  dkB = 3.16
  rA = dkA + 1.0
  write(*,*) rA
End Program Type_Alias_Exp[/quote]

板凳

建立模块
module prcs
    implicit none
    integer, parameter :: DP = selected_real_kind(p=13,r=200)  ! 这里改精度p和范围r,这样与编译器无关
end module prcs

program main
    use prcs
    implicit none
    complex( Kind = DP ) :: c1 , c2
.....
.....
    c1 = c2 + cmplx(1.0_DP,2.0_DP)
end program main

3 楼

或者使用预处理也是可以的~

4 楼


多谢啊哈哈

5 楼


请问当一个程序有很多文件时,
Integer , parameter :: MyKind = 4 !// 将来修改此处为 8 既可改为双精度
上面这一行是不是要在每个文件中都定义,还是只需要在主程序中开始的地方定义一下

6 楼

难道你从来不用module么

7 楼

在多文档的程序里,可以用 include 或者 module 解决这个问题。

推荐使用 module

我来回复

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