2014-03-04 60 views
4

我想在子程序中使用的可分配数组,但编译器抱怨FORTRAN - 子程序

Error: Dummy argument 'locs' with INTENT(IN) in variable definition context (ALLOCATE object) at (1) 

我能找到的唯一的事情是,我应该使用显式接口分配数组,我正在做什么。这里的子程序的相关代码:

RECURSIVE SUBROUTINE together(locs, LL, RL) 

    INTEGER, DIMENSION(:,:), ALLOCATABLE, INTENT(IN)   :: locs 
    INTEGER, INTENT(IN)           :: LL, RL 


    ALLOCATE(locs(LL,RL)) 


END SUBROUTINE together 

回答

5

编译器的错误信息是描述问题的一种。用INTENT(IN)你是说这个对象不会改变,但是你继续尝试ALLOCATE它。

是的,一个明确的接口将需要调用,但这不是问题。

函数Fortran 2008标准说,在部分5.3.10该

与意图nonpointer对象(IN)属性不应出现在可变denition上下文

分配是一个这样的上下文:第16.6.7节,第(11)点。

2

locs伪参数是可分配的,并且具有INTENT(IN)属性 - 此处的intent属性指示调用过程向子例程提供信息。

INTENT(IN)属性的后果是,您无法更改locs的分配状态(或值)。你的ALLOCATE语句试图做到这一点。

+0

谢谢。现在有道理!我试图这样做的原因是因为我试图让它工作: 'IF(ANY(locs .eq。next(k:k + 1)))THEN' 它们不一样排名,我知道,但我无法想象一个解决方法,不通过整个数组循环 –

+2

尝试问一个单独的问题,详细说明你正在尝试做什么。 – IanH

+0

重新评论中的新问题。设置一个逻辑标志为false。设置一个包含IF语句的命名循环来检查条件。如果条件满足,将标志设置为true并使用'exit'提前退出循环。 –

0

尝试在你的主程序中分配你的数组,然后当locs被推送到你的子程序时,使用INTENT(INOUT)告诉编译器你也想改变你的数组的内容。