代码:
double precision maxstress(w)
real, dimension(:), allocatable, save :: han(w)
integer jang(w)
do i=1,nblock
if(maxstress(i) . gt. 1000) then
jang(i) =1
han(i) = han(i) + 1
else
jang(i) =0
endif
write(*,*) "jang", i, jang(i)
write(*,*) "han", i, han(i)
enddo
给出错误消息:
findnode2.for(47): error #6646: ALLOCATABLE or POINTER attribute dictates a deferred-shape-array [HAN]
real, dimension(:), allocatable, save :: han(w)
-----------------------------------------------^
在此代码中,我需要制作静态变量han
,但发生错误#6646。
我需要做什么?
显而易见的答案是删除allocatable
属性,因为所示的代码中没有任何内容可以指示han
为什么应分配。注意dimension(:)
也是多余的,并且被忽略了。只是做:
real, save :: han(w)
(大概w
是整数参数)
交替做:
real, dimension(:), allocatable, save :: han
然后在可执行代码中do allocate(h(w))
您的问题中没有什么可以表明这与Abaqus有关。
这里有很多混乱。您说这是一个子例程,但您没有显示子例程标头。我不知道这三个阵列是否是虚拟论点,这会使它们的"可调阵列"(大概是)也是一个假人参数,或者也许它们都是局部阵列,W是唯一的假人,这使得它们是唯一的假人它们"自动"阵列。无论哪种情况,可分配或指针属性都是冲突。
您还谈论"静态变量han",但没有什么可以暗示为什么它应该是静态的(而且不是。)
如果您希望一个或多个阵列可分配,则使用(:)作为边界,然后将它们分配到所需的大小。请注意,如果这些是局部变量,则在子例程返回时将自动划分它们,除非它们还获得了保存属性。(如果它们是虚拟论点,您不能说保存,并且如果从Abaqus调用这一点,也可能是可分配的,并且(:)是不合适的。
我的猜测是至少其中一些数组是虚拟论点,也许一个或多个是本地变量。如果是这样,则简单地删除可分配的解决方案应该是正确的解决方案。但是正如其他人所指出的那样,您已经遗漏了很多东西,因此无法确定。