Compiler construction 重新编译为os\2编译的旧fortran 2/4\66程序需要在dos中运行
我正在帮助一位老科学家解决一些问题,他找到了一个程序,并且 大约20年前修改过,作为32位os\2可执行文件运行良好,但我需要它 在dos下运行!我不是一名程序员,而是一名优秀的硬件和软件人员,所以我是 这个问题很愚蠢,但我下载了6个不同的 编译器watcom77、silverfrost ftn95、gfortran、g77和f80的两个版本。沃特康 说它是为了旧的程序,找到旧的编译器,silverfrost打开它,调试,等等。 但是正在将所有子程序从“真实”更改为“复杂”,反之亦然,以及 77国集团似乎安装得很好(图书馆链接等),但甚至不会编译 我的问题是1;重新编译“原样”或“升级”代码? 程序xconvlv 整数N,N2,MCompiler construction 重新编译为os\2编译的旧fortran 2/4\66程序需要在dos中运行,compiler-construction,fortran,Compiler Construction,Fortran,我正在帮助一位老科学家解决一些问题,他找到了一个程序,并且 大约20年前修改过,作为32位os\2可执行文件运行良好,但我需要它 在dos下运行!我不是一名程序员,而是一名优秀的硬件和软件人员,所以我是 这个问题很愚蠢,但我下载了6个不同的 编译器watcom77、silverfrost ftn95、gfortran、g77和f80的两个版本。沃特康 说它是为了旧的程序,找到旧的编译器,silverfrost打开它,调试,等等。 但是正在将所有子程序从“真实”更改为“复杂”,反之亦然,以及 77
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
有4个子例程,这是大约3页的代码,这将是很多
如果某人能够帮助我,则可以更轻松地向其发送电子邮件。我的电子邮件是
mastermikie4356@yahoo.com,或者如果有人能告诉我在哪里可以找到“工作”
可以重新编译这个的编译器?
谢谢你,谢谢你,谢谢你对我的帮助!
我犯的错误是;
1.在从另一个过程调用CONVLV时,第一个参数的类型为
REAL(kind=1),它现在是一个复合体(kind=1)
2.在从另一个过程调用REALFT时。。。复杂(种类=1)现在是
真实的(种类=1)
3.在从…COMPLEX(kind-1)调用TWOFFT时,它现在是实数(kind=1)
4.在之前对FOUR1的调用中,第一个参数的类型为REAL(kind=1)
现在它很复杂(kind=1)。快速阅读该程序后,我没有发现任何重大问题。文件名被“硬编码”到open语句中——您可能需要更改这些文件名,以匹配将程序移植到的任何计算机上的位置 对于FORTRAN 77,行号以外的源代码应该从第7列开始 如果您需要更具体的建议,请向我们显示错误消息
我建议尝试一两次编译并找出代码所需的更改,而不是安装大量编译器,以为这样可以让程序正常工作。错误消息表明调用例程和子例程之间存在参数不匹配(发送类型为REAL,预期类型为COMPLEX)。 这可能是一个错误,或者更可能是一些在旧编译器上有效但在新编译器上无效的非标准技巧
你能发布每个子程序的标题吗?(或整个程序的链接?谢谢你的回答,这里是我得到的acsess violtions我没有链接的网站,但会通过电子邮件发送给你