2011-01-10 4 views
0

私は古い科学者にいくつかの問題を抱えており、見つけたプログラムが1つあり、 は、前に実行し、32ビットOSの実行可能ファイルとしては正常に動作しますが、私は dosの下で実行する必要があります!私はプログラマーではなく、良いハードウェアです&ソフトウェアの男ですので、私は この問題についてかなり愚かですが、ここで私は6種類の異なる コンパイラwatcom77、silverfrost ftn95、gfortran、g77とf80の2つのバージョンをダウンロードしました。 Watcom は古いプログラムで古いコンパイラsilverfrostがそれを開きデバッグなどを行っていると言っています すべてのサブルーチンを "real"から "complex"およびvice-vesaに変更していて、 g77は完全にインストールされているようです(ライブラリリンクなど)しかし、コンパイルさえしないでください test.f programs.My問題は1です;コードを "そのまま"再コンパイルするか、 "アップグレード"しますか? PROGRAMはxconvlv INTEGER N、N2、Mos 2のためにコンパイルされた古いfortran 2/4 66プログラムを再コンパイルすると、DOSで実行する必要があります

PARAMETER (N=2048,N2=2048,M=128) 
INTEGER i,isign 
REAL data(n),respns(m),resp(n),ans(n2),t3(n),DUMMY 
OPEN(UNIT=1, FILE='C:\QKBAS20\FDATA1.DAT') 
DO 1 i=1,N 
    READ(1,*) T3(i), data(i), DUMMY 
continue 
    CLOSE(UNIT-1) 
do 12 i=1,N 
    respns(i)=data(i) 
    resp(i)=respns(i) 
continue 
isign=-1 
call convlv(data,N,resp,M,isign,ans) 
    OPEN(UNIT=1,FILE='C:\QKBAS20\FDATA9.DAT') 
    DO 14 i=1,N 
    WRITE(1,*) T3(i), ans(i) 
    continue 
END 
SUBROUTINE CONVLV(data,n,respns,m,isign,ans) 
INTEGER isign,m,n,NMAX 
REAL data(n),respns(n) 
COMPLEX ans(n) 
PARAMETER (NMAX=4096) 
* uses realft, twofft 
INTEGER i,no2 
COMPLEX fft (NMAX) 
do 11 i=1, (m-1)/2 
    respns(n+1-i)=respns(m+1-i) 
continue 
do 12 i=(m+3)/2,n-(m-1)/2 
    respns(i)=0.0 
continue 
call twofft (data,respns,fft,ans,n) 
no2=n/2 
do 13 i=1,no2+1 
    if (isign.eq.1) then 
    ans(i)=fft(i)*ans(i)/no2 
    else if (isign.eq.-1) then 
    if (abs(ans(i)) .eq.0.0) pause 
    ans(i)=fft(i)/ans(i)/no2 
    else 
    pause 'no meaning for isign in convlv' 
    endif 
continue 
ans(1)=cmplx(real (ans(1)),real (ans(no2+1))) 
call realft(ans,n,-1) 
return 
END 

SUBROUTINE realft(data,n,isign) 
INTEGER isign,n 
REAL data(n) 
* uses four1 
INTEGER i,i1,i2,i3,i4,n2p3 
REAL c1,c2,hli,hir,h2i,h2r,wis,wrs 
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp 
theta=3.141592653589793d0/dble(n/2) 
cl=0.5 
if (isign.eq.1) then 
    c2=-0.5 
    call four1(data,n/2,+1) 
else 
    c2=0.5 
    theta=-theta 
endif 
(etc.,etc., etc.) 


SUBROUTINE twofft(data,data2,fft1,fft2,n) 
INTEGER n 
REAL data1(n,data2(n) 
COMPLEX fft1(n), fft2(n) 
* uses four1 
INTEGER j,n2 
COMPLEX h1,h2,c1,c2 
c1=cmplx(0.5,0.0) 
c2=cmplx(0.0,-0.5) 
do 11 j=1,n 
    fft1(j)=cmplx(data1(j),data2(j) 
continue 
call four1 (fft1,n,1) 
fft2(1)=cmplx(aimag(fft1(1)),0.0) 
fft1(1)=cmplx(real(fft1(1)),0.0) 
n2=n+2 
do 12 j=2,n/2+1 
    h1=c1*(fft1(j)+conjg(fft1(n2-j))) 
    h2=c2*(fft1(j)-conjg(fft1(n2-j))) 
    fft1(j)=h1 
    fft1(n2-j)=conjg(h1) 
    fft2(j)=h2 
    fft2(n2-j)=conjg(h2) 
continue 
return 
END 

SUBROUTINE four1(data,nn,isign) 
INTEGER isign,nn 
REAL data(2*nn) 
INTEGER i,istep,j,m,mmax,n 
REAL tempi,tempr 
DOUBLE PRECISION theta, wi,wpi,wpr,wr,wtemp 
n=2*nn 
j=1 
do 11 i=1,n,2 
    if(j.gt.i)then 
    tempr=data(j) 
    tempi=data(j+1) 
(etc.,etc.,etc.,) 
continue 
mmax=istep 
goto 2 
endif 
return 
END 

コードの約3ページであると誰かにはるかに簡単 に電子メールもwhouldこれで4サブルーチンがある場合はそのこれで私を助けることができます私の電子メールは [email protected]ですか、誰かがこれを再コンパイルする可能性のある "作業中の" コンパイラをどこから入手できるのか教えていただけますか? ありがとう、ありがとう、ありがとうございました! 私が得るエラーは、 1.別のプロシージャからCONVLVを呼び出すと、最初の引数はタイプ REAL(kind = 1)でした。これは現在COMPLEX(kind = 1)です。 2.別のプロシージャからREALFTを呼び出します。 COMPLEX(kind = 1)今度は REAL(kind = 1) 3.複雑な(kind-1)からTWOFFTへの呼び出しでは、REAL(kind = 1) になりました。 FOUR1への以前の呼び出しでは、最初の引数はタイプREAL(kind = 1) でした。これは現在、COMPLEX(kind = 1)です。

答えて

0

プログラムをすばやく読んでも大きな問題はありません。ファイル名は開いているステートメントに「ハードコード」されています。プログラムを移植しているどのコンピュータであれ、その場所に合わせてファイル名を変更する必要があるかもしれません。

FORTRAN 77の場合は、行番号以外のソースコードを使用すると、より具体的なアドバイスをしたい場合は、列7

に開始私たちにエラーメッセージが表示されるはずです。

私は、1つか2つのコンパイルで試してみて、何らかの形でプログラムが動作するという考えで、多数のコンパイラをインストールするのではなく、コードに必要な変更を考え出すことをお勧めします。

+0

ypurのお返事ありがとうございます、ここではacsess violtions iam取得 –

0

エラーメッセージは、呼び出し側ルーチンとサブルーチン間で引数の不一致があることを示しています(送信タイプREAL、予想タイプCOMPLEX)。 これは、古いコンパイラでは動作したものの、新しいコンパイラでは動作しない、間違った、あるいはおそらくは非標準的なトリックかもしれません。

各サブルーチンからヘッダーを投稿できますか? (またはプログラム全体へのリンク?)

+0

私はこれをリンクするサイトがありません –

+0

または私に教えてくださいリンクするには? –

関連する問題