Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: mini me 08. 01. 2016, 09:12:20

Název: Přepis syntaxe Fortran
Přispěvatel: mini me 08. 01. 2016, 09:12:20
Zdravim,
potreboval bych poradit, jak prepsat stary kod z Fortranu do neceho, co lze kompilovat jednoduseji.
Melo by to nacist tabulku nejakych cisel (?), ale prekladac si stezuje na -fcoarrays, stary format, neplatnou syntaxi,.... podle toho, jakym dialektem to zkusim prelozit.
Finalne bych potreboval nacist ta binarni data a ulozit je jako textovy soubor.
Diky za rady,
mini me

Kód: [Vybrat]
      integer NFA,NK
      parameter (NFA=4, NK=8)
      character*40 FTABLE
      parameter (FTABLE='\usr\brok\tab4.dat')
      integer n

      double precision p,pt,at(0:NFA-1),atcalc(0:NFA-1),ki(0:NFA-1,NK)
      common /parms[NEAR]/pt,at,atcalc,ki,p,n

      integer*1 tab[HUGE](NFA-1,0:NFA**NK-1)
      common /stable/ tab
     
      integer i,j
      open (unit=1,file=FTABLE,status='old',form='binary')
      read (1) ((tab(j,i),j=1,NFA-1),i=0,NFA**NK-1)
      close (unit=1)

Název: Re:prepis syntaxe FORTRAN
Přispěvatel: hfius 08. 01. 2016, 10:24:27
Rekl bych, ze je to kus rozsahlejsiho programu (popisy common v jedne subroutine nemaji vyznam). Dal jsem pochopil, ze je potreba binarni soubor '\usr\brok\tab4.dat' ulozit textove. Tady je reseni, ktere muze obsahovat chyby, protoze nemam dany soubor a jak to vyzkouset:

Kód: [Vybrat]
program x
  implicit none
   integer, parameter :: NFA = 4, NK = 5
   integer*1 tab(NFA-1,0:NFA**NK-1)
   integer :: i,j

  open(1,file='\usr\brok\tab4.dat', status='old',form='binary')
  read (1) ((tab(j,i),j=1,NFA-1),i=0,NFA**NK-1)
  write(*,*) ((tab(j,i),j=1,NFA-1),i=0,NFA**NK-1)
  close (1)
end program x

Tento kod ulozis jako x.f95 Preklad by mel probehnout jako:

bash$ gfortran  -g -Wall -fbacktrace -fcheck=all  x.f95
Název: Re:Přepis syntaxe Fortran
Přispěvatel: mini me 08. 01. 2016, 10:54:01
Dekuji za radu.
Ano, je to kus vetsiho starodavneho kodu, ze ktereho potrebuji ziskat hlavne obsah toho binarniho souboru.

Zkusil jsem to prelozit pomoci gfortran, gcc 4.10.0 mingw32. Pise:

Kód: [Vybrat]
x.f95:7.53:
       open(1,file='tab4.dat', status='old',form='binary')

Error: FORM specifier in OPEN statement at (1) has invalid value 'binary'

Tusim, ze ten binarni soubor byl vyroben pomoci Fortranu 77, a ze F95 nema zpetnou kompatibilitu.

Puvodne jsem zkousel datovy soubor nacist pomoci R, ale jelikoz nevim, jak se soubor strukturovany, tak jsem chtel radeji pouzit puvodni kod. Myslim, ze by mel obsahovat 3 sloupce s predpocitanymi hodnotami, pricemz to by mely byt asi "integer".

Kód: [Vybrat]
> to.read = file("c:/tmp/tab4.dat", "rb")
> readBin(to.read, integer(), n = 10, endian = "big")
 [1]        1        1        1 16777218      257    65537    65537 16777218
 [9]      257      257
>


Název: Re:Přepis syntaxe Fortran
Přispěvatel: hfius 08. 01. 2016, 11:17:56

...

Kód: [Vybrat]
x.f95:7.53:
       open(1,file='tab4.dat', status='old',form='binary')

Error: FORM specifier in OPEN statement at (1) has invalid value 'binary'
V tom pripade bych pouzil form='unformated'.

Citace
Tusim, ze ten binarni soubor byl vyroben pomoci Fortranu 77, a ze F95 nema zpetnou kompatibilitu.

Zpetna kompatibilita sice neni zarucena, ale v praxi ji vsechny prekladace peclive dodrzuiji.
Mnohem horsi pripad je, ze binarni reprezentace je implementacne zavisla a je mozne, ze binarni soubor
me nejakou zajimavou strukturu, jinou nez predpoklada gfortran. Cili pokud to bylo ukladane necim kompatibilnim
(gcc, gfortran, g77,..), je to skoro urcite citelne, tak jak jsem psal.

Citace
Puvodne jsem zkousel datovy soubor nacist pomoci R, ale jelikoz nevim, jak se soubor strukturovany, tak jsem chtel radeji pouzit puvodni kod. Myslim, ze by mel obsahovat 3 sloupce s predpocitanymi hodnotami, pricemz to by mely byt asi "integer".

Kód: [Vybrat]
> to.read = file("c:/tmp/tab4.dat", "rb")
> readBin(to.read, integer(), n = 10, endian = "big")
 [1]        1        1        1 16777218      257    65537    65537 16777218
 [9]      257      257
>


Melo by jit o tabulku 4-1 x 5**4-1 = 3 x 625-1 cisel. integer*1 znaci 1-byte integer (v C je to signed char s rozsahem -128 .. 127).

Zalezi na implementatci, ale bezne jsou dva zpusoby ulozeni:

 * postupne za sebou, byte po byte s tim, ze nejrychleji se meni prvni index (tohle dela gcc)
 * po nasobich 4-byte kvuli rychlejsimu cteni - pak by to ulozeni ovsem nebylo moc effektivni z hlediska velikosti.

Tohle se musi vyzkouset. Samozrejme, ted kdyz uz znas strukturu, je vzdycky mozne to udelat v C (nebo mozna i R).

[/quote]
Název: Re:Přepis syntaxe Fortran
Přispěvatel: mini me 08. 01. 2016, 12:36:24
Vyreseno. Je to celkem jednoducha tabulka. V onech dobach to asi bylo potreba pouzivat v binarni podobe.
Diky za pomoc.

Kód: [Vybrat]
0 0 0
1 0 0
0 1 0
0 0 1
1 0 0
2 0 0
1 1 0
1 0 1
0 1 0
1 1 0
0 2 0
0 1 1
0 0 1
...