Fortran 77 powrót polski | english

góra

Argumenty wywołania programu

W kompilatorach: g77 i f95 sa dostępne dwie funkcje:


IARGC
  integer iargc()
  - pobranie liczby argumentow
  eg. ./a.out ala ma kota
  -<  3

GETARG
  call getarg(i,arg)
  - pobranie i-tego argumentu < character*(*) arg
  i=0,iargc

Program testowy wygląda tak:

      program test_arg
      integer iargc
      integer argc
      character*50 argv(10)

      argc=iargc()
      write (*,*) 'Liczba argumentow:', argc
      do i=1,min(argc,10)
        call getarg(i,argv(i))
        write (*,*) 'Argument numer',i,'=',argv(i)
      enddo

      end

góra

Ułożenie tablic w pamięci

Jeśli ktoś lubi notacje XY, to o tablicach Fortranowych, bedzie myślał tak:

 dimension tablica(4,10)
 tablica(i,j) = i - j
    i ---->
 j
 |
 |
\|/
        0     1     2     3
       -1     0     1     2
       -2    -1     0     1
       -3    -2    -1     0
       -4    -3    -2    -1
       -5    -4    -3    -2
       -6    -5    -4    -3
       -7    -6    -5    -4
       -8    -7    -6    -5
       -9    -8    -7    -6


W pamięci:                                   __ tab(1,3)
                                  /
                                 /
        0  1  2  3 -1  0  1  2 -2 -1  0  1 -3 -2 -1  0 ...
       \         / \         / \         / \         /
         1 wiersz    2 wiersz    3 wiersz    4 wiersz
           j=1         j=2         j=3         j=4
        


tablica(1,j) ---  poczatek j-tego wiersza

Przykład użycia:

  subroutine test(tab)
    dimension tab(4)
    print *,(tab(i),i=1,4)
  end

  call test(tablica(1,j))
  

przekaże j-ty wiersz do wypisującej procedury

Jeśli ktoś woli zapis wskaźników w kolejności macierzowej, będzie mówił o kolumnach zamiast wierszy. Prócz tej nomenklatury, nic się nie zmieni.


góra

Generatory liczb pseudo-losowych

W Fortranie 77 nie ma standartu dotyczącego generatorów liczb pseudo-losowych, dlatego każdy kompilator ma własne funkcje i wlasny ich sposób wywoływania. Poniżej przedstawiam dwa sposoby na otrzymanie liczb pseudo-losowych działające w kompilatorze GNU:

1. Inicjalizujemy generator podając ziarno za pomocą procedury srand

        program random_test1
        implicit none
        real a,b,c,d

        call srand(22231)
        a=rand(0)
        b=rand(0)
        c=rand(0)
        d=rand(0)
        print *, "first 4 numbers:", a, b, c, d
        end

2. Inicjalizujemy generator podając ziarno w pierwszym wywołaniu funkcji rand

        program random_test2
        implicit none
        real a,b,c,d

        a=rand(22231)
        b=rand(0)
        c=rand(0)
        d=rand(0)
        print *, "first 4 numbers:", a, b, c, d
        end

Uwaga, program wywołany z tym samym ziarnem da te same wyniki!

Do prawdziwych obliczeń należy ziarno zaczerpnąć z jakiegos niezależnego żródła. Polecam czytanie z urządzenia /dev/random, ale najłatwiejszym i najszybszym sposobem jest pobranie czasu systemowego i użycie jego jako ziarna generatora. Ciekawostką jest to, że programy uruchomione w tej samej sekundzie, dadzą te same wyniki.

        program random_test3
        implicit none
        real a,b,c,d
        integer seed

c       get system time as seed (number of seconds from 1970)
        seed=time()

c       start generator with seed
        call srand(seed)

c       take successive numbers
        a=rand(0)
        b=rand(0)
        c=rand(0)
        d=rand(0)
        print *, "first 4 numbers:", a, b, c, d 
        print *, "with seed=",seed
        end


administratorem jest Jan Skowron, strona znajduje sie na serwerze astrouw.edu.pl
Valid HTML! Valid CSS!