2017-07-29 5 views
1

私はプログラムをコンパイルしようとしていて、簡単な問題に遭遇しました。しかし、私はまだそれを解決することができませんでした。どんなアイデアも非常に高く評価されています。プログラムは次のようになり、gfortranはdouble complex変数で問題をコンパイルします

コード:

subroutine rescal(zy,nvar) 

    integer nvar,i, nexponent 
    double complex zy(nvar) 
    double precision maxabs, scalfac 

    maxabs = 0.d0 
    do i = 1, nvar 
    maxabs = max(zabs(zy),maxabs) 
    enddo 

maxabs((ランク0))zymaxabsの最大を格納する必要があります。シンプル、そう?

私はこのプログラムをgfortranでコンパイルしようとしましたが、次のエラーが発生しました。コンパイラがmaxabsがランク1であり、ランク0ではないと不平を言っている理由は分かりません。私の理解では、zabsは倍精度複素数で使用する正しい関数です。

gfortran -e -Ofast -ffixed-line-length-none -std=legacy -c -o rescal.o rescal.f 
rescal.f:13.8: 

maxabs = max(zabs(zy),maxabs) 
1 
Error: Incompatible ranks 0 and 1 in assignment at (1) 
make: *** [rescal.o] Error 1 

答えて

1

maxは、配列引数を指定すると配列結果を返す要素関数です。ここでの問題は、zabs(zy)が配列であることです。

だけで、あなたはをごループとしてzyの要素を選択する不足している:あなたが使用して非標準の特定zabsを回避することができます

  • do i = 1, nvar 
        maxabs = max(zabs(zy(i)),maxabs) ! Select the i-th element of zy 
    enddo 
    

    、ポイントのカップルを言いましたジェネリックabs;

  • maxval機能を利用できます。

代わり

maxabs = MAXVAL(ABS(zy)) 
+0

ああを持つことができます!ありがとうございました!私は指数を見ないようにバットとして盲目になったに違いない。再度、感謝します! – januka

関連する問題