0

コード:

  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 が発生します。

私は何をする必要がありますか?

4

2 に答える 2

1

ここには多くの混乱があります。これはサブルーチンだとおっしゃっていますが、サブルーチンのヘッダーは表示されていません。3つの配列が仮引数であるかどうかはわかりません。これにより、(おそらく)次元も仮引数として渡された「調整可能な配列」になるか、またはおそらくそれらはすべてwが唯一のダミーであるローカル配列であり、それらは「自動」配列です。いずれの場合も、ALLOCATABLE または POINTER 属性は競合します。

「静的変数ハン」についても話しますが、静的であるべき理由を示唆するものは何もありません(そうではありません)。

1 つ以上の配列を割り当て可能にする場合は、境界として (:) を使用してから、それらを目的のサイズに割り当てます。これらがローカル変数である場合、SAVE 属性も指定されていない限り、サブルーチンが戻るときに自動的に割り当てが解除されることに注意してください。(それらが仮引数の場合、SAVE とは言えません。また、これが ABAQUS から呼び出されている場合、ALLOCATABLE と (:) は不適切である可能性があります。

私の推測では、これらの配列の少なくとも一部は仮引数であり、おそらく 1 つまたは複数がローカル変数です。もしそうなら、単純に ALLOCATABLE を削除するのが正しい解決策です。しかし、他の人が指摘しているように、あなたは多くのことを省きすぎて、確実に知ることは不可能です.

于 2017-12-27T22:50:09.847 に答える