2011-01-10 2 views
0

저는 오래된 과학자에게 몇 가지 문제를 돕고 있으며 발견 한 프로그램이 1 개 있고 이 약 20 세가 수정되었습니다. 전, 그리고 32 비트 운영 체제로 \ 2 실행 파일로 잘 실행하지만 그게 dos에서 실행해야합니다! 나는 프로그래머가 아니지만 좋은 하드웨어이다. & 소프트웨어 맨이다. 나는이 문제에 대해 어리 석다. 컴파일러 watcom77, silverfrost ftn95, gfortran, g77 및 f80의 2 가지 버전을 다운로드했다. Watcom 은 구식 컴파일러를 찾고 silverfrost가 열어 디버그 등을 수행하지만 모든 서브 루틴을 "real"에서 "complex"및 vice-vesa로 변경하고 g77은 완벽하게 설치하는 것 같습니다 (도서관 링크 등)하지만 심지어 컴파일 test.f programs.My 문제는 1; 코드를 "있는 그대로"또는 "업그레이드"하려면 다시 컴파일 하시겠습니까? 프로그램은 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) 4입니다. FOUR1에 대한 이전 호출에서 첫 번째 인수는 유형 REAL (kind = 1) 이었으며 이제는 COMPLEX (kind = 1)입니다.

답변

0

프로그램을 빨리 읽었을 때 큰 문제는 없습니다. 파일 이름은 열려있는 명령문에 "하드 코드"되어 있으므로 프로그램을 이식 할 컴퓨터의 위치에 맞게 파일 이름을 변경해야 할 수도 있습니다.

FORTRAN 77, 줄 번호 이외의 소스 코드는 좀 더 구체적인 조언을 원하는 경우에, 열 7

에서 시작하는 우리에게 오류 메시지를 표시해야합니다.

필자는 하나 또는 두 개의 컴파일 링을 시도하고 코드가 필요한 변경 사항을 알아내는 대신 여러 가지 컴파일러를 설치하는 대신 아이디어가있는 컴파일러를 사용하는 것이 좋습니다.

+0

ypur 응답에 감사드립니다. 여기에 acsess violtions가 있습니다. –

0

오류 메시지는 호출 루틴과 서브 루틴 (REAL 유형, COMPLEX 유형 예상) 간의 인수 불일치가 있음을 나타냅니다. 이것은 오래된 컴파일러에서는 작동하지만 새로운 컴파일러에서는 작동하지 않는 비표준 트릭이나 실수 일 수 있습니다.

각 서브 루틴에서 헤더를 게시 할 수 있습니까? (또는 프로그램 전체에 대한 링크?)

+0

나는 이것을 연결하는 사이트가 없지만 –

+0

또는 어떻게 말해야합니까? 그것을 연결하려면? –

관련 문제