首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PGI在此模块中没有选择public属性?

为什么PGI在此模块中没有选择public属性?
EN

Stack Overflow用户
提问于 2012-11-29 01:26:35
回答 1查看 634关注 0票数 0

在这里使用别人的代码。它用gfortran编译得很好。然而,在Portland Group下,我得到一个错误:

代码语言:javascript
复制
pgf90 -DsysLinux -DcompPGF90 -I/home/cables/GITM/share/Library/src  -c  -r8 -fast        ModUtilities.F90
PGF90-S-0084-Illegal use of symbol mpi_wtime - not public entity of module (ModUtilities.F90: 419)
0 inform,   0 warnings,   1 severes, 0 fatal for sleep

令人不快的代码行如下所示:

代码语言:javascript
复制
use ModMpi, ONLY : MPI_wtime

(显然,这里有很多MPI内容,但我不认为这是重点。)因此,我转到ModMpi的源代码,即ModMpi.f90,在那里我看不到对MPI_WTIME的引用,但我看到:

代码语言:javascript
复制
use ModMpiInterfaces

最后,我转到ModMpiInterface的源代码,找到下面这行:

代码语言:javascript
复制
public:: mpi_wtime

好的,通过编辑ModMpi.f90并将mpi_wtime声明为公共的,我能够从PGI获得一个编译器。但我仍然想知道:为什么gfortran (显然)假设mpi_wtime是公开的,而PGI必须被明确告知这一点?为什么PGI不假设原始的公共声明在整个“使用链”中都有效?

我假设其中一种行为更接近Fortran标准。那是哪一个呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-29 08:28:40

对于完全相同的FortranMPI源代码,(而不是某种MPI库)的编译器行为在这里应该是相同的。

实体是否是模块的公共实体取决于定义或访问(通过使用)该实体的每个模块。模块A可能声明"something“并指定它是公共的,模块B可能使用模块A,然后指定同样的"something”是私有的。使用模块A的任何代码将能够访问“某些东西”,而只使用模块B的任何代码将不能访问“某些东西”。

在模块中声明的事物的缺省可访问性是公共的,但该缺省值可以通过私有语句(没有任何后续标识符的语句)来更改。如果出现这样的私有语句,您将看到使用PGI编译器描述的行为。

隐式类型(例如,从源代码中没有隐式NONE)在这里也会造成混乱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13610927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档