Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
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)
-
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:
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
-
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:
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".
> 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
>
-
...
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'.
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.
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".
> 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]
-
Vyreseno. Je to celkem jednoducha tabulka. V onech dobach to asi bylo potreba pouzivat v binarni podobe.
Diky za pomoc.
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
...