代码:
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会发生。
我需要做什么?
答案 0 :(得分:1)
显而易见的答案是删除allocatable
属性,因为显示的代码中没有任何内容表明han
应该可分配的原因。请注意,dimension(:)
是多余的并被忽略。只是做:
real, save :: han(w)
(推测w
是整数参数)
交替做:
real, dimension(:), allocatable, save :: han
然后在可执行代码中执行allocate(h(w))
您的问题中没有任何内容表明这与abaqus有任何关系。
答案 1 :(得分:1)
这里有很多混乱。你说这是一个子程序,但你没有显示子程序头。我不知道这三个数组是否是伪参数,这将使它们成为“可调整数组”,维度(可能)也作为伪参数传递,或者它们都是本地数组,其中w是唯一的虚拟数据,这使得他们是“自动”阵列。在任何一种情况下,ALLOCATABLE或POINTER属性都是冲突。
你也谈到“静态变量汉”,但没有什么可以暗示为什么它应该是静态的(并且它不是。)
如果您希望一个或多个数组可分配,则使用(:)作为边界,然后将它们分配到所需的大小。请注意,如果这些是局部变量,则子例程返回时将自动释放它们,除非它们也被赋予SAVE属性。 (如果它们是伪参数,你不能说SAVE,如果从ABAQUS调用它也可能是ALLOCATABLE和(:)也不合适。
我的猜测是这些数组中至少有一些是伪参数,也许一个或多个是局部变量。如果是这样,只需删除ALLOCATABLE应该是正确的解决方案。但正如其他人所指出的那样,你已经遗漏了很多东西,这是不可能确定的。