回 帖 发 新 帖 刷新版面

主题:初始化赋值的问题

在一个module文件中有这样一行
 real(8)  ::  DF(1:3) = (/2.2d-5, 2.19d-5, kappa*epsilon**(1.d0 + tau)/)

其中kappa,epsilon,tau这些变量前面都定义过了。用gfortran,ifort编译该文件都没有问题,但sun的f90和95通不过,显示如下错误:
            DF(1:3) = (/2.2d-5, 2.19d-5, kappa*epsilon**(1.d0 + tau)/)   ,&
                                             ^                             
"parameters.f03", Line = 10, Column = 42: ERROR: All ac-value expressions in an array constructor must have the same type and type parameters.
                                                            ^             
"parameters.f03", Line = 10, Column = 58: ERROR: The exponent in a constant initialization expression must be type integer.

这个用法好像是03标准才开始支持,我用gfortran -std=f95同样会出现后一个错误。也许说明sun的编译器还没有全部支持03特性?请问怎样修改这个变量定义可以避免这样的错误?
多谢各位

回复列表 (共6个回复)

沙发

最简单的考虑就是一个一个赋值呀。

板凳


这是在一个module文件里定义供其它文件用的,由于不能出现执行语句只能这样写了,如何一个个的赋值?另外实数形式的幂指数如何变成f95允许的形式?

3 楼

[quote]  real(8)  ::  DF(1:3) = (/2.2d-5, 2.19d-5, kappa*epsilon**(1.d0 + tau)/)
其中kappa,epsilon,tau这些变量前面都定义过了。 [/quote]

kappa,epsilon,tau 这些只是变量吗?我看必须是常量(parameter)吧。您知道为什么吗?当定义它们为常数后, x ** y 中,根据 Fortran 2003 标准,y 必须为 整数。

有些问题,你退一步考虑,就海阔天空了,您专门写一个子程序初始化 Module 中的变量就可以了。

4 楼

如下程序,示范某前面所说: 当 x 不用 parameter 修饰时,编译器会给出错误提示:

error #6592: This symbol must be a defined parameter, an enumerator, or an argument of an inquiry function that evaluates to a compile-time constant.   [X]
error #6973: This is not a valid initialization expression.

program main
  implicit none
 
  real, parameter:: x = 2.0
  real:: y = 3.0 ** x
  write(*, *) "y = ", y
  
  stop
end program main

5 楼


epsilon这些都定义成常量的。所以ifort,gfortran不会报错,我想知道sun的编译器报错的原因。

6 楼


不纠缠这个问题了。我的程序原来的结构不好,所有的常数定义在一个module里,其他子程序通过use该模块使用这些常数。现在准备将变量在module里定义protected属性,免得其他程序修改,然后在该模块里定义一个子程序,该子程序通过读取文件给这些常量赋值。
多谢楼上各位的回复!

我来回复

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