Fortran Coder

标题: 关于自定义类型type的使用 [打印本页]

作者: taotao0718    时间: 2015-2-14 15:24
标题: 关于自定义类型type的使用
本帖最后由 taotao0718 于 2015-2-16 09:00 编辑

编译时发生这样错误fortcom: Error: mod_random_forcing.F, line 59: This entity cannot be PUBLIC since its derived type is PRIVATE.   [RAN]      type(forcing_fields)   ,save :: ran, ran1
-----------------------------------^

原程序的一部分:
   
[Fortran] 纯文本查看 复制代码
 module mod_random_forcing
#define FFTW
      use mod_xc
      implicit none
c --- shield everything
      private
      type forcing_fields
         character(len=5) tforce
         real slp    (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  Sea level pressure
         real taux   (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  wind stress in x direction
         real tauy   (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  wind stress in y direction
         real wndspd (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  wind speed (tke source)
         real airtmp (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  pseudo air temperature
         real relhum (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  relative humidity
         real clouds (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  cloud cover
         real precip (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  precipitation
         real sss    (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  SSS for relax
         real sst    (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  SST for relax
         real uwind  (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  u-component of wind
         real vwind  (1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  v-component of wind
         real tauxice(1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  ice stress on water in x dir
         real tauyice(1-nbdy:idm+nbdy,1-nbdy:jdm+nbdy) !  ice stress on water in y dir
      end type forcing_fields
c

...................
...................
...................
c --- These will hold the forcing fields (dim and nondimensional)
      type(forcing_fields)   ,save :: ran, ran1


我改为  type(forcing_fields)   ,save,private :: ran, ran1
依旧是一样的错误,不知道有没有高手可以指点一下,谢谢


mod_random_forcing.F

33.63 KB, 下载次数: 5

mod_xc_common_blocks.zip

32.96 KB, 下载次数: 1


作者: 楚香饭    时间: 2015-2-14 18:19
不知道你用什么编译器?我这里是没法重现你的错误的。

如果可以,请给出更多的代码,至少要有 mod_xc 模块。或者经过简化以后给出,至少让我们能够正常编译。
作者: taotao0718    时间: 2015-2-15 09:26
楚香饭 发表于 2015-2-14 18:19
不知道你用什么编译器?我这里是没法重现你的错误的。

如果可以,请给出更多的代码,至少要有 mod_xc 模块 ...

谢谢,已添加了附件,用的是ifort编译器
作者: 楚香饭    时间: 2015-2-15 17:30
我还是找不到 mod_xc 模块,还有 common_blocks.h 文件。
作者: taotao0718    时间: 2015-2-16 09:02
楚香饭 发表于 2015-2-15 17:30
我还是找不到 mod_xc 模块,还有 common_blocks.h 文件。

不好意思哈,昨天漏传了,其实还有个问题,不知道这是不是和编译器版本不一样,或者netcdf还有openmpi的选择有关,就是在有的机器上没有问题,但是换机器就出现了这个问题。
作者: 楚香饭    时间: 2015-2-16 09:53
1.如果 ran 是 public 属性的,那么它的类型 :forcing_fields 也必须是 public 属性的。这是 F95 的规定。
2.你的代码里有 public :: init_random_forcing, rand_update, ran,所以,尽管你写了 type(forcing_fields)   ,save,private :: ran, ran1 ,但 ran 仍然是 public 的。
3.请根据自己的需要,确定 ran 是 public 还是 private 的。
4.如果 ran 是 public 的,那么请加一句 public forcing_fields
作者: taotao0718    时间: 2015-2-16 09:59
楚香饭 发表于 2015-2-16 09:53
1.如果 ran 是 public 属性的,那么它的类型 :forcing_fields 也必须是 public 属性的。这是 F95 的规定。 ...

我之前把第六行的private注释了,就通过了,默认public属性,不知道会不会影响最终结果
谢谢您这几天的帮忙,祝新年快乐!
作者: 楚香饭    时间: 2015-2-16 10:10
我一早就想让你去掉 private,但是怕影响你其他的程序。比如有重名的变量,如果public可能就变成同一个变量了。

所以最好还是保持原有的 private,单独让 ran 和 forcing_fields 变成 public 比较可靠。

新年好~~
作者: taotao0718    时间: 2015-2-25 10:06
楚香饭 发表于 2015-2-16 10:10
我一早就想让你去掉 private,但是怕影响你其他的程序。比如有重名的变量,如果public可能就变成同一个变量 ...

电脑坏了,才看到这条,再试试看,谢谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2