taotao0718 发表于 2015-2-14 15:24:36

关于自定义类型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.         type(forcing_fields)   ,save :: ran, ran1
-----------------------------------^

原程序的一部分:
    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
依旧是一样的错误,不知道有没有高手可以指点一下,谢谢


楚香饭 发表于 2015-2-14 18:19:15

不知道你用什么编译器?我这里是没法重现你的错误的。

如果可以,请给出更多的代码,至少要有 mod_xc 模块。或者经过简化以后给出,至少让我们能够正常编译。

taotao0718 发表于 2015-2-15 09:26:54

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

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

谢谢,已添加了附件,用的是ifort编译器

楚香饭 发表于 2015-2-15 17:30:22

我还是找不到 mod_xc 模块,还有 common_blocks.h 文件。

taotao0718 发表于 2015-2-16 09:02:01

楚香饭 发表于 2015-2-15 17:30
我还是找不到 mod_xc 模块,还有 common_blocks.h 文件。

不好意思哈,昨天漏传了,其实还有个问题,不知道这是不是和编译器版本不一样,或者netcdf还有openmpi的选择有关,就是在有的机器上没有问题,但是换机器就出现了这个问题。

楚香饭 发表于 2015-2-16 09:53:08

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:03

楚香饭 发表于 2015-2-16 09:53
1.如果 ran 是 public 属性的,那么它的类型 :forcing_fields 也必须是 public 属性的。这是 F95 的规定。 ...

我之前把第六行的private注释了,就通过了,默认public属性,不知道会不会影响最终结果
谢谢您这几天的帮忙,祝新年快乐!

楚香饭 发表于 2015-2-16 10:10:29

我一早就想让你去掉 private,但是怕影响你其他的程序。比如有重名的变量,如果public可能就变成同一个变量了。

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

新年好~~{:2_31:}

taotao0718 发表于 2015-2-25 10:06:43

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

{:3_41:}电脑坏了,才看到这条,再试试看,谢谢
页: [1]
查看完整版本: 关于自定义类型type的使用