0

私は FORTRAN のまったくの初心者で、1000 行の FORTRAN ソース ファイルを自分で使用するために苦労して MATLAB に変換しています。PRINT変数を追跡し、数学が正しく機能していることを確認するために、大量のステートメントを挿入することで、これまでのところ順調に進んでいます。FORTRAN で解決できない奇妙なハプニングが発生しました。

そのように定義されたサブルーチンがあります

subroutine addprc 
complex tmat,b,ci,c1,c2,cim,ab1(50),ab2(50),acans(10,2),fg1(50),fg2(50)
common dtr,rtd,pi 
common /mtxcom/ nrank,nranki,tmat(50,50),b(50,50),cmxnrm(25)
common /cmvcom/ nm,kmv,cmv,twm,prodm 

以下にもう少し割り当てがありcommonますdimensionが、それらは関係ありません。ab1(50)配列が最初に定義されるのは、このサブルーチンです。私の MATLAB スクリプトでは、 として初期化しましたab1=zeros(1,50);。次に、このループで使用されます (FORTRAN):

do 20 n = 1,nrank 
np = n+nrank 
cn = real(n)
n1 = n+1 
c1 = 4.0*ci**n 
c2 = 4.0*ci**n1 
p1 = cn*costh*pnmllg(n1)-(cn+cmv)*pnmllg(n) 
p2 = cmv*pnmllg(n1) 
ab1(n-ij) = c1*p2*uu1 
ab1(np-ijt) = -c2*p1*uu1 
ab2(n-ij) = -c1*p1*uu2 
ab2(np-ijt) = c2*p2*uu2 

この時点で他のすべての変数の値を確認しましたが、それらは MATLAB スクリプトと一致しています。逆方向に作業すると、何らかの形でab1既に値が含まれているという問題が発見されました。ループの直前の印刷コマンドなど

PRINT *,'before ab1', SUM(ab1)
do 20 n = 1,1

戻ります(107.500008, 5.38305187)。これは複素数なので 2 つの値は問題ありませんが、実際に何かが含まれているという事実は問題ではありませんか? ab1実際、このコード ブロックでのみ使用される時間があります。

ここに欠けているものはありますか?ソース ファイル (ctrl-f: ab1) を調べて、そのインスタンスを見つけました。元のソースは .for ファイルで、gfortran を使用して Eclipse でコンパイルしました。御時間ありがとうございます。

4

2 に答える 2

1

ただ疑問に思っているのは、代わりに何を期待するのでしょうか?

これらの値はメモリから取得されます。変数を定義する何か (関数/プログラム/サブルーチン) を呼び出すと、メモリの一部が定義された変数に関連付けられますが、変数に何かを割り当てるまでは、以前にメモリに存在していたものを使用します。コンピューターのメモリはリセットされることなく常に再利用されているため、すでに終了している他の呼び出された関数/サブルーチンからの変数から値を取得することができます。個人データが含まれている可能性があります)またはその他のもの。一般的なルールは、致命的な必要がない限り、メモリを何らかの値に設定するような高価な操作を行う人は誰もいないということです (たとえば、変数に関連付けられたメモリを必要な数値に設定する場合や、メモリを消去しないことが潜在的なセキュリティ上の欠陥である場合) .

要約すると、これらの値は初期化されていないメモリから取得されます。正確な内容は未定です。

メモリが初期化されているかどうかのチェックは非常にコストのかかる操作であるため、初期化されていないメモリにアクセスしてもエラーは発生しません。ただし、この場合にエラーを表示するツールがあります。

  1. プログラムが初期化されていないメモリにアクセスするかどうかを知りたい場合は、valgrind. このようなチェックは非常にコストがかかることに注意してください。
  2. わずか 3 倍のスローダウンでこの仕事を行うと主張するclang MemorySanitizerフィルターもありますが、clang は C/C++ コンパイラであるため、clang を使用する前に fortran プログラムを C に変換する必要があります (たとえば、f2c を使用)。また、このフィルタを有効にして、プログラムが clang で使用するすべてのライブラリをコンパイルする必要があります。
于 2013-11-09T19:12:22.527 に答える