Для перекомпиляции старой программы fortran 2/4 \ 66, скомпилированной для os \ 2, необходимо запустить ее в DOS - PullRequest
0 голосов
/ 10 января 2011

Я помогаю старому ученому с некоторыми проблемами, и у меня есть 1 программа, которую он нашел и изменил около 20 лет.назад, и работает как 32-битный OS \ 2 исполняемый файл, но мне нужно, чтобы он работал под DOS!Я не программист, но хороший специалист по аппаратному и программному обеспечению, поэтому я довольно глуп по поводу этой проблемы, но здесь я скачал 6 различных компиляторов watcom77, silverfrost ftn95, gfortran, 2 версии g77 и f80.Watcom говорит, что это старая программа, находит более старый компилятор, silverfrost открывает его, отлаживает и т. Д., Но меняет все подпрограммы с «настоящих» на «сложные» и наоборот, и g77, кажется, устанавливает отлично (ссылки на библиотекии т. д.), но даже не буду компилировать программы test.f. Моя проблема - 1;перекомпилировать «как есть» или «обновить» код?ПРОГРАММА xconvlv INTEGER N, N2, M

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), теперь это COMPLEX (kind = 1) 2. При вызове REALFT из другой процедуры ... COMPLEX(kind = 1) теперь это REAL (kind = 1) 3. При вызове TWOFFT из ... COMPLEX (kind-1) теперь это REAL (kind = 1) 4. При предыдущем вызове FOUR1первый аргумент имел тип REAL (вид = 1), теперь это комплекс (тип = 1).

Ответы [ 2 ]

0 голосов
/ 12 января 2011

Сообщения об ошибках указывают на несоответствие аргументов между вызывающей подпрограммой и подпрограммой (тип отправки REAL, ожидающий тип COMPLEX).Это может быть ошибкой или, скорее, неким нестандартным приемом, который работает на старых компиляторах, но не работает на новых компиляторах.

Можете ли вы публиковать заголовки каждой подпрограммы?(или ссылка на всю программу?)

0 голосов
/ 10 января 2011

При быстром чтении программы я не вижу серьезных проблем.Имена файлов «жестко закодированы» в операторы open - вам может понадобиться изменить их, чтобы они соответствовали их расположению на любом компьютере, на который вы переносите программу.

Для FORTRAN 77 - исходный кодкроме номеров строк должны начинаться в столбце 7.

Если вам нужен более конкретный совет, покажите нам сообщения об ошибках.

Я предлагаю попробовать с одной или двумя компиляцией и выяснить изменения, необходимыекод, а не установка многочисленных компиляторов с идеей, что каким-то образом можно заставить программу работать.

...