Wgan/Zajęcia/FORTRAN77

FORTRAN 77

Jak wygląda program

Wstęp

Program składa się z linii kodu programu. Każda linia ma określony format:

Etykieta może wystąpiś jedynie w linii która jest pocvzątkiem istrukcji. Jeśli w pierwszej linii znajduje się litera 'C' lub '*' - linia ta zawiera komentaż. Komentaże nie mogą być kontynuowane w następnej linii - można natomiast umieścić w następnej linii kolejny komentaż. Komentaże są pomijane przez kompilator podobnie jak spacje które nie mają żadnego znaczenia jeśli nie są częścią stałych tekstowych..

Linie kodu program w języku FORTRAN tworzą ciąg bloków z których jeden jest typu PROGRAM, a pozostałe - typu FUNCTION, SUBROUTINE lub BLOCK DATA. W FORTRANie nie ma zagnieżdżania bloków. Blok na postać:

     DEKLARATOR_BLOKU nazwa(lista parametrów)
            deklaracje zmiennych
            zawartość bloku (wiele linii kodu)
        END

Blok PROGRAM jest tym od którego zaczynają się obliczenia. Jeśli komputer zakończy wykonywanie instrukcji zawartych w bloku PROGRAM, to program uważa sięza zakończony. Inne bloki zawierają funkcje i procedury które moga być wywołane z innych bloków (bloku PROGRAM oraz innych funkcji i procedur).

Funkcje wywołujemy podając ich nazwy i, w nawiasach, parametry, procedury wywołuje się pisząc instrukcję CALL nazwę procedury i w nawiasach - parametry.

Blok PROGRAM

Blok program jest blokiem od którego rozpoczyna się wykonywanie programu. W bloku tym możemy podać nazwę programu, ale ma ona znaczenie komentarza.

Blok FUNCTION

Blok definicji funkcji musi posiadać nazwę - która jednoznacznie identyfikuje funkcję w programie. Ta nawa będzie używana jeśli będziemy chcieli tą funkcje wywołać. Po nazwie funkcji wymieniamy w nawiasach listę parametrów na której wymieniamy jedynie nazwy pod jakimi parametry będą widoczne w bloku funkcji. Typy parametrów, podobnie ja typ wartości zwracanej przez funkcję - definiując typ zmiennej o takiej samej nazwie jak funkcja.

Jeśli funkcja nie wymaga podania parametrów (jest bezargumentowa) - listę parametrów oraz nawiasy można pominąć

Wartość zwracaną wipisujemy do zmiennej o nazwie funkcji. Nazwa ta moze pojawić się jedynie po lewej stronie znaku równości.

Jeśli jako parametr przy wywoływaniu funkcji podamy nazwę zmiennej - to zostanie ona przekazana przez referencję i będzie można zmienić jej wartośc z wnętrza funkcji. Jeśli przy wywoływaniu funkcji, w miejscu parametry, wpiszemy wyrażenie - zostanie ono przekazane przez wartość.

Blok SUBROUTINE

Blok definicji podprogramu wygląda podobnie jak blok definicji funkcji, nie nma tu jednak sensu definiowanie typu ani przypisywanie na nazwę procedury. Podobnie ja w funkcji - parametry przekazywane są przez referencję - o ile to jest możliwe.

Typy danych

Zmienne proste

Zmienne identyfikowane są przez ich nazwy. Nazwa zmiennej składa się z ciągu znaków (liter i cyfr) z których pierwszy jest literą. Długość nazwy zmiennej nie może przekraczać 6 znaków. W FORTRANie wystepują następujaće typy zmiennych:

Zmienne zajmują zawsze określoną ilość miejsca w pamięci komputera. Zmienne typu INTEGER, REAL oraz LOGICAL zajmują jedną jednostkę pamięci, Zmienne typu DOUBLE PRECISION oraz COMPLEX - dwie takie jednostki.

Zmienne proste nie muszą być deklarowane. Jeśli zmienna nie jest zadeklarowana - jej typ jest określony przez pierwszą literę nazwy tej zmiennej. Jeśli zmienne jast zadeklarowana - jej typ określa jej deklaracja.

Tablice

Tablice muszą być zadeklarowane przed ich użyciem. Deklaracja może być określeniem typu tablicy. Wygląda to wtedy jak deklarowanie typu zmiennej prostej, jednak po nazwie zmiennej podaje sie w nawiasach okrągłych rozmiar (rozmiary - dla tablicy wielowymiarowej) tablicy. Rozmiar możemy podać pojedynczą liczbą - indeks tablicy przebiega wtedy wartości od 1 to zadanej wartości włącznie. Mozna także okreslić jawnie zakres zmiany indeksu podając dwie liczby oddzielowe dwukropkiem - min:max.

Tablicę można również definiować używając deklaratora DIMENSION, lub wymieniając go na liście instrukcji COMMON. W obu tych przypadkach typ jest zależny od pierwszej litery nazwy tablicy.

Inne typy

W programie napisanym w języku FORTRAN nie ma tu możliwości definiowania struktur ani tablic których elementami są tablice. Nie ma także możliwości zadeklarowania tablic o rozmiarze dynamicznie wyznaczanym przez program.

Instrukcje przypisania i operatory

Przypisania

Instrukcje przypisania mają postać zmienna=wyrażenie. Jest to naturalna i prosta forma zapisu. Najpierw wartościowana jest prawa strona wyrażenia, następnie następuje przypisanie wartości do zmiennej. Prawidłowe są wieć konstrukcje I=I+1.

Przypisania wykonywane na wycinek tekstu (fragment zmiennej tekstowej) dotyczą zawsze tylu znaków ile zawiera wycinek. W razie piotezby zawartość wycinka uzupełniana jest spacjami.

Inną formą przypisania jest instrukcja ASSIGN o formacie ASSIGN etykieta TO zmienna, gdzie zmienna jest zmienną całkowitą, natomiast etykieta jest etykietą z bierzącego segmentu. Użycie tej instrukcji pozwana na wykonywanie skoków do etykiet zapamiętywanych w zmiennych.

Operatory arytmetyczne

W FORTRANie dostępne są podstawowe dwuargumentowe operatory arytmetyczne:

Typ wyniku zależy od typu argumentów

Konstuując wyrażenia można używać nawiasów w celu zmiany priorytetów działan w wyrażeniu. Jeśli nie użyto nawiasów, to priorytety są następujące: wywołania funkcji, potęgowanie, mnorzenie i dzielenie, dodawanie i doejmowanie.

Operatory logiczne

Wyrażenia logiczne można konstruować używając operatorów logicznych oraz operatorów relacji. Operatory logiczne operują na argumentach logicznych, Operatory relacji pozwalają na wartościowanie logiczne warunków nakładanych na wartości wyrażeniń arytmetycznych i znakowych. Operatory logiczne oraz oepratory relacji wyglądają nieco dziwniem ale używa się ich w taki sam sposób jak operatorów arytmetycznych. Do dyspozycji mamy:

Operatory znakowe

W Języku FORTRAN jest tylko jeden operator znakowy - operator łączenia (konkatenacji) napisów - // . Inną operacją która nie jest określona żadnym operatorem jest operacja brania wycinka tekstu. Operację tą zapisuje sie jako znienna(od:do), gdzie zmienna jest nazwą zmiennej znakowej, a wartości od i do są wyrażeniami całkowitymi spełniającymi warunek: 1<=od<=do<=dlugość tekstu

Wywołania funkcji

Wywołanie funkcji ma postać nazwafunkcji(argumenty), gdzie nazwa funkcji jest nazwą funkcji wbudowanej lub zadeklarowanej przez programistę, natomiast argumenty funkcji są listą wyrażeń oddzielonych przecinkami, których liczba oraz typy musza być zgodne z ilością i typami parametrów jakie są zadeklarowane w definicji tej funkcji.

Instrukcje sterujące

Instrukcja skoku: GOTO

Instrukcja GOTO zmienia kolejność wykonywania instrukcji w programie - kolejną instrukcją które będzie wykonana, będzie instrukcja umieszczona w linii opatrzonej wskazaną etykietą. Instrukcja GOTO występuje w trzech postaciach:

Instrukcja warunkowa IF

Istrukcja IF pozwala na wykonywanie pewnych fragmentów programu w zależności od prawdziwości pwenych wyrażeń logicznych. W języku FORTRAN, instrukcja warunkowa występuje w trzech mutacjach:

Instrukcja pętli: DO

Istrukcja DO służy do zorganizowania pętli w programie. Istrukcja ma postać DO etykieta zm=w1,w2,w3, gdzie etykieta, jest etykietą ostatniej instrukcji wykonywanej w pętli i muśi znajdować się poniżej instrucjki DO. Zmienna zm, jest zmienna sterującą pętli. Na poczatku pętli nadawana jest jej wartość równa wartości wyrażenia w1, i po każdym obiegu pętli dodawana jest wartość wyrażenia w3. Instrukcje w pętli powtarzane są do chwili, kiedy zmienna zm będzie miała wartość większą lib równa wyrażeniu w2. Wyrażenie w3 może być pominięte, i wtedy krok pętli wynosi 1.

Wartości wyrażeń w2 i w3 są wyliczane tylko raz na początku pętli i na ich podstawie wyznaczana jest ilość obiegów pętli DO. Zmiana składników wyrażeń wewnątrz pętli nie wpłynie w żaden sposób na ilość iteracji pętli. Podobnie nie ma sensu zmieniać w pętli wartości zmiennej sterującej. Nie będzie to miało żadnego znaczenia (niektóre kompilatory wykażą wtakiej sytuacji błąd, lub wypiszą ostrzerzenie).

Instrukcja pusta: CONTINUE

Instrukcja CONTINUE nic nie robi. Efektem jej wykonania jest przejście do kolejnej linii programu. Najczęściej jest używana jako ostatnia istrukcja pętli.

Instrukcja wywołania procedury: CALL

Instrukcja CALL słuzy do wywoływania procedury. Po instrukcji CALL powinna występować nazwa procedury oraz, w nawiasach, lista jej argumentów. Liczba i rodzaj parametrów musi sie oczywiście zgadzać z liczbą i rodzajem argumentów jakie zadeklarowano w definicji procedury. Wywołania funkcji nie wymagają użycia żadnych specjalnych dekoracji.

Instrukcja powrotu z podprogramu: RETURN

Wykonanie instrukcji RETURN powoduje powrót z podprogramu lub funkcji. Instrukcja ta nie ma żadnych parametrów. Wartość jaką zwaraca funkcja powinna być przypisana do zmiennej o takiej samej nazwie jak nazwa funkcji.

Instrukcja zatrzymania programu: STOP

Wykonanie instrukcji STOP powoduje natychmiastowe zakończenie wykonywania programu.

Instrukcja END

Instrukcja END kończy segment. Dodatkowo jest interpretowana jako instrukcja STOP lub RETURN, w zależności od tego czy jest umieszczona na końcu segmentu głównego, cz segmentu zawierającego procedurę lub funkcję.

Wejście/Wyjście

Wstęp

Pliki oraz użądzenia wejścia/wyjścia traktowane są jak zboiry zawierające rekordy. Pojedyncza instrukcja wprowadzająca lub wyprowadzająca dane dotyczy zawsze całego rekordu. Odpowiednikiem rekordu w pliku oraz na urządzeniu wejścia - wyjścia jest linia tekstu - ciąg znaków o stałej długości zakończuny przejściem do nowej linii.. Wyprowadzania danych powoduje przejście do nowej linii - poniewaz zapisywany jest zawsze cały rekord..

Każda instrukcja wyprowadzania lub wprowadzania danych wymaga podania formatu w jakim będą wyprowadzone dane. Można określić plik jako nieformatowany, ale jego uzycie jest wtedy znacznie utrudnione.

Pliki oraz urządzenia, przypisane są kanaom, z których każdy jest identyfikowany liczbą całkowitą. Domyślny kanał można wyprać pisząc w miejscu w którym wymagany jest numer - gwiazdkę.

Instrukcje wejścia/wyjścia

W języku FORTRAN 77, dostępne sa trzy instrukcje obsługujące wejście/wyjście: READ - dla wejścia, oraz WRITE i PRINT dla wyścia. Instrukcja READ yystępuje w dwu wariantach:

Gdzie: lista zmiennych - jest ciągiem nazw zmiennych przeznaczonych do wczytania z wejścia lub wyprowadzenia na wyjście. Lista sterowania zawiera listę specyfikatorów. Pierwszy specyfikator może nie mieć nazwy - jest wtedy traktowany jako numer kanału. Drugi parametr oznacza etykietę instrukcji FORMAT zawierającej wzorzec formatowania wyprowadzonego tekstu.

Na liście zmiennych, przy wprowadzaniu lub wyprowadzaniu tablic, można uzyć pewnej ciekawej konstrukcji, tzw. DO implikowanego. Przypomina ona instrukcję DO: READ *, (A(i), I=1,10). W tej instrukcji, z do tablicy A przeczytane będą elementy od 1 do 10. Proste?

Formatowanie

Podczas większości operacji wejścia/wyjścia należy podać w jaki sposób mają być sformatowane wyprowadzane informacje. Format wybiera się podając etykietę instrukcji FORMAT. Instrukcja ta może być umieszcziona w dowolnym miejscu w bloku w którym jest używana. Instrukcja FORMAT ma postaćL FORMAT(wzorzec), gdzie wzorzec jest ciągiem stałych tekstów oraz specyfikatorów wskazujących jakiego typu zmienne będą wyprowadzana i jaką precyzją.

W tabeli przedstawiono pełną listę deskryptorów oraz znaków sterujących wyprowadzaniem informacji

Deskryptor   Znaczenie
rA   Pole znakowe. Przy wyprowadzaniu - długość jest równa długości pola znakowego
rAw   Pole znakowe - okreslona dlugosc pola
prDw.d   pole podwójnej precyzji
prEw.d   pole rzeczywiste w postaci wykładniczej
prEw.dEe   pole rzeczywiste w postaci wykładniczej. Wartość e określa szerokość pola wykładnika
prFw.d   pole rzeczywiste w postaci stałoprzecinkowej
prGw.d   pole rzeczywiste - jak prEw.d lub prFw.d
prGw.dEe   pole rzeczywiste - jak prEw.dEe lub prFw.d
rIw   pole całkowite
rIw.m   pole całkowite. Wartość m wskazuje na ilość cyfr widocznych w polu.
iLw   pole logiczne
BN   Ignoruj slacje w polu numerycznym
BZ   Niewiodące spacje w polu numeryczny traktuj jako 0
kP   Współczynnik skalowania
S   Sterowanie wyprowadzaniem znaku liczby. Znaczenie jak SP lub SS w zależności od procesora
SP   dukować znak plus przy wyprowadzaniu liczb dodatnich
SS   znak plus nie ma być dukowany przy wyprowadzaniu liczb dodatnich
TLs   Przesunięcie bierzącej pozycji o s znaków w lewo
TRs   Przesunięcie bierzącej pozycji o s znaków w prawo
'text'   wyprowadzenie stałego teksu
wHtext   wyprowadzenie stałego teksu
X   pomijanie znaków spacji przy wprowadzaniu
r(grupa)   Powtórzenie grupy zrecyfikatorów r-razy

Poszczególne znaki oznaczają:

znak   Znaczenie
d   liczba znaków po przecinku
p   współczynnik skalowania
r   repetytor w postaci stała* (może być pominięty jeśli mielibyśmy napisać "1*"
w   szerokość pola w znakach

Formatowania można ponadto dokonać pisząc zamaiast etykiety instrukcji FORMAT, dowolne wyrażenie znakowe mające postać wzorca formatowania, lub zmienna znakową zawierającą sensowny wzorzec.

Użycie plików

Aby używać plików jako wejścia, wyjścia lub przestrzeni do przechowywania danych - należy otworzyć plik i przypisać go do określonego kanału. Plik po użyciu musi być zamknięty, aby był dostępny dla innych programów. Oczywiście używać (czytać/pisać) możemy jedynie plików które są otwarte. Pliki możemy otwierać jako pliki tymczasowe - są one kasowane podczas zamykania, lub normalne - nowe - plik jest tworzony w trakcie otwierania, lub stare - plik jest jedynie otwierany.

Poza tym otwierany plik możemy określić jako plik o dostępie sekwencyjnym - a więc taki który można czytać "jak leci", oraz plik o dostępie swobodnym - w którym możemy programowo zmieniać pozycję w której będziemy pisać/czytać.

Wszystkie instrukcje dotyczące użycia plików mnają podobny format. Po słowie kluczowym, w nawiasach podajemy listę specyfikatorów w postaci: (specyfikator=wartosc, ...). Pełna lista dopuszczalnych specyfikatorów znajduje się poniżej.

W języku FORTRAN77 dostępne są operacje:

Specifikatory dla instrukcji wejścia/wyjścia

Wszystkie dostępne specyfikatory zestawione są w tabelce poniżej. W poszczególnych kolumnach umieszczono: nazwę specyfikatora, znaczenie, oraz kontekst w jakim może być użyty. Poszczególen litery odpowiadają instrukcjom OPEN, CLOSE, INQUIRE i REWIND

Specyfikator   Znaczenie   Kontekst
UNIT   Numer urządzenia.   OCIR
IOSTAT   Nazwa zmiennej całkowitej która po zakończeniu operacji zawierać będzie kod błędu.   OCIR
ERR   Numer etykiety do której należy skoczyć jeśli podczas operacji nastąpił błąd.   OCIR
FILE   Nazwa pliku   O-I-
STATUS   Rodzaj pliku: 'NEW' - tworzy nowy plik, 'SCRATCH' - plik tymczasowy, 'OLD' - istniejący plik, 'UNKNOWN' - nie bardzo wiadomo jaki. Dla specyfikatora CLOSE - dopuszczalne są dwie wartości 'KEEP' lub 'DELETE' oznaczające odpowiednio - zachowanie pliku i usunięcie go przy zamykaniu. Domyślną wartością jest 'UNKNOWN'.   OC--
ACCESS   Metoda dostępu: 'SEQUENTIAL' - plik sekwencyjny, 'DIRECT' - plik o dostępie swobodnym. Domyślną wartością jest 'SEQUENTIAL'   O-I-
FORM   Tryb redagowania: 'FORMATTED' - plik formatowany, 'UNFORMATTED' - plik nieformatowany. Wartość domyślna zależy od typu pliku FOR gdy SEQ, UNF gdy DIR   O-I-
RECL   Długość rekordu - tylko dla plików o dostępie swobodnym.   O-I-
BLANK   Znaczenie spacji: Pola numeryczne są dopełniania znakiem spacjii - 'NULL' lub zerem - 'ZERO'. Warość domyślna: 'NULL', Dla instrukcji INQUIRE - posajemy nazwę zmiennej znokowej w któej zostanie umieszczony napis 'ZERO' lub 'NULL'   O-I-
EXIST   Wskazanej zmiennej logicznej przypisuje wartość FALSE - jeśli plik związany z urządzeniem nie istnieje, lub TRUE - jeśli istnieje   --I-
OPENED   Wskazanej zmiennej logicznej przypisuje wartość TRUE - jeśli plik związany z urządzeniem jest otwarty - w przeciwnym wypadku - FALSE   --I-
NUMBER   Jeśli plik związany jest z urządzeniem (kanałem), to zmiennej całkowitej przypisuje sie numer tego urządzenia. Użycie tego specyfikatora ma sens jedynie w przypadku gdy zamiast specyfikatora UNIT użyto specyfikatora FILE w instrukcji INQUIRE   --I-
NAMED   Wskazanej zmiennej logicznej przypisuje wartość TRUE - jeśli plik związany z urządzeniem ma nazwę- w przeciwnym wypadku - FALSE   --I-
NAME   Wskazanej zmiennej tekstowejj przypisuje wartość będącą nazwą pliku o ile plik posiada nazwę.   --I-
SEQUENTIAL   Wskazanej zmiennej znakowej przypisuje wartość 'YES' - jeśli do urządzenia/pliku można pisać/czytać sekwencyjnie, 'NO' - jeśli nie można i 'UNKNOWN' - jeśli nie wiadomo czy można czy nie   --I-
DIRECT   Wskazanej zmiennej znakowej przypisuje wartość 'YES' - jeśli do urządzenia/pliku można usyskać dostęp bezpośredni, 'NO' - jeśli nie można i 'UNKNOWN' - jeśli nie wiadomo czy można czy nie   --I-
FORMATTED   Wskazanej zmiennej znakowej przypisuje wartość 'YES' - jeśli do urządzenia/pliku można pisać lub czytać w sposób formatowany (o stałej długości rekordów), 'NO' - jeśli nie można i 'UNKNOWN' - jeśli nie wiadomo czy można czy nie   --I-
UNFORMATTED   Wskazanej zmiennej znakowej przypisuje wartość 'YES' - jeśli do urządzenia/pliku można pisać lub czytać w sposób nieformatowany (o zmiennej długości rekordów), 'NO' - jeśli nie można i 'UNKNOWN' - jeśli nie wiadomo czy można czy nie   --I-
NEXTREC   Numer następnego rekordu o ile plik jest otwarty z dostępem swododnym   --I-

Deklaracja i inicjacja danych, zmienne wspólne

Definicje stałych

Stałe w programie definiuje się poleceniem PARAMERTER, podając w nawiasie litę par nazwa=wartość. Typy stałych okreslamy tak samo jak typy innych symboli w programie --> patrz następny paragraf.

Deklaracja zmiennych

Zmienne deklarujemy jedynie na początku bloku. Zmienne proste możemy deklarować podając nazwę typu oraz listę zmiennych które będą miały ten typ. Elementy na liście oddzielamy przecinami. Jeśli na liście występują tablice, to można od razu okreslić ich wymiar lub wymairy picząc w nawiasach rozmiar tablicy. W przypadku zmiennych tekstowych definiuje się ich długość podając jąpo gwiazdce (znaku mnożenia): CHARACTER*8 IDENT.

Jeśli nie zadeklarulemy tupu zmiennej. określi go pierwsza litera jej nazwy. Domyślnie zmienne zaczynające się na:

Interpretację pierwszel litery nazwy zmiennej można zmienić używając instrukcji IMPLICIT w formacie IMPLICIT lista_typow_i_ znaków, gdzie listatypów i znaków jest listą elementów (oddzielonych przecinkami) o formacie typ(zakres liter). Zakres liter to litery oddzielone przecinkami, lub konstrukcja od - do zapisana jako litera-litera.

Tablice muszą mieć określony rozmiar. Jeśli nie deklarujemy ich określając ich typ, muślimy określić ich rozmiar za pomocą poecenia DIMENSION. Używa sięgo podobnie jak deklaratorów typu, z tą róznicą, że typ elementów tablicy określa pierwszy znak jej nazwy.

Podobnie jak nazwy zmiennych, w ciele funkcji definiujemy typy jej parametrów oraz typ zwracany przez funkcję (w procedurze typu parametrów). W FORTRANie nie ma możliwości podania typów parametrów na liście parametrów. Typy definiulemy poprzez nazwę zmiennej (pierwszą literę), lub poprzez zdefiniowanie typu w taki sam sposób jak zmiennych lokalnych bloku - w jego wnętrzy (patrze przykład na końcu dokumentu)

Nadawanie wartości początkowych

Zmiennym i tablicom można nadawać wartości początkowe uzywając instrukcji DATA o formacie DATA lista zmiennych / listastałych, gdzie lista zmiennych jest taką samą zlistą jak lista w istrukcji READ (łącznie z możliwością użycia DO implikowanego), z zastrzezeniem, że wszystkie indeksy tablic muszą być stałymi. Lista stałych zawiera stałe odpowiednich typów. Jeśli trzeba zainicjować wiele kolejnych zmiennych tą samoą wartością - możemy użyć repetytora w postaci liczba* poprzedzając nim wartość. Przykład użycia: DATA X, I, (A(K), K=1,20) / 1.0, 5, 10*0.0, 4.0, 5.0, 8*1.0.

Wartościom umieszczonym w obszarach wspólnych. inicjuje się w segmentach typu BLOCK DATA Segmenty te mają postać:

     BLOCK DATA nazwa_bloku_jak_w_common
            COMMON /nazwa_bloku_jak_w_common/ A, B, I(10)
            DATA A, B, I / 0.0, 5.92, 4*3, 6*0
        END

Wewnątrz bloku BLOCK DATA mogą występować jedynie instrukcje IMPLICIT, PARAMETERm DIMENSION, COMMON, EQUIVALENCE i DATA.

Obszary wspólne - czyli jak dzielić zmienne pomiędzy blokami

W zasadzie wszystkie dane powinny być przekazywane jako parametry funkcji i procedur (przekazywane zawsze kiedy to mozliwe poprzez referencje), ale czasami prowadzi to to niepotrzebnej komplikacji kodu programu. Dzieje się tak wtedy, gdy pewne zmienne powinny być dzielone pomiędzy kilkoma modułami (np ustawienia, pewne stałe symulacji zadawane przez użytkownike itp.). W takiej sytuacji powinniśmy zadeklarować wspólny blok danych, w którym będziemy umieszczali zmienne widoczne (dostępne) wenątrz poszczególnych modułów.

Bloki wspólne mogą być nazwane lub nienazwane. W programie może być tylko jeden nienazwany blok wspólny, oraz dowolna liczba bloków z nazwą. Bloki wspólna są rozróżnianie poprzez ich nazwę (nienazwany - to tak jakby nazwa była pustym tekstem).

Dostęp do wspólnego bloku uzyskujemy poprzez zmienne zadeklarowane lokalnie. Komenda COMMON definicja bloku, gdzie definicja bloku zawiera nazwę bloku pomiędzy nakami '/' oraz listę zmiennych które będą umieszczone w tym bloku. Instrukcja COMMON nie definiuje nowych nazw ani ich zasięgu. Określa tylko jakie zmienne i w jakiej kolejności umieszczone są w bloku wspólnym. Poszczególne zmienne umieszczone w bloku wspólnym, mogą mieć różne nazwy w różnych blokach programu. Typy poszczególnych zmiennych (widocznych w różnych modułach) nie muszą być zgodne - chociaż nezgodnośc nie ma tu sensu. Nie powinno się jednak umieszczać w tym zamym miejscu zmiennych liczbowych (zajmujących jedną lub dwie jednostki pamięci - tzw. jednostki numeryczne) oraz znakowych - których długość mierzona jest w jednostkach znakowych.

Przykładowo: Jeśli w jednym bloku napiszemy COMMON A,B,I4,M(30), a w drugim COMMON X, I(32). to zmienna X w drugim bloku będzie miała taką samą wartość jak zmienna A w pierwszym. Podobnie, tożsame będą zmienne i elementy tablicy B = I(1), I4=I(2), M(1)=I(3), M(2)=I(4) itd. Podobnie dzieje się w przypadku tablic wielowymiarowych, które sąumieszczane w pamięci w kolejności indeksów: np. tablica M(3,3) zawiera kolejno elementy: M(1,1), M(2,1), M(3,1), M(1,2), M(2,2), ...

Jedna instrukcja COMMON może zawierać definicję wielu bloków - są one oddzielone przecinkami.

Equivalence - coś jakby unia

Jeśli zmienne lub tablice mają zajmować ten sam obszar pamięci, możemy tego zarządać stosując instrukcję EQUIVALENCE, po której podajemy listę typu (lista identyfikatorów), (...), ... .Lista identyfikatorów - jest listą nazw zmiennych które będą umieszczone w tym samym miejscu w pamięci. Jeśli wskarzemy na liście komórki tablic, to równierz kolejne i poprzednie komórki będą na siebie nachodziły ponieważ elementy tablic zawsze zajmuja ciągły obszar pamięci. W odróżnieniu od instrukcji COMMON, EQUIVALENCE definiuje równoważność lokalną - w jednym bloku programu.

Alternatywne wejście do procedury/funkcji

Do każdej funkcji lub procedury mozna zdefiniowac doatkowe punkty wejścia uzywając instrukcję ENTRY o podobnej składni jak instrukcja FUNCTION lub SYBROUTINE. Rodzaj i liczba parametrów nie musi byc zgodna z listą parametrów funkcji/prcedury w której definiujemy dodatkowe wejście. Nazwami wejść możemy posługiwać się tak samo jak nazwami funkcji i procedur.

Dodatkowo w procedurech mozna uzywac paametru formalnego w postaci '*' Parametr taki oznacza mozliwość skoku do wybranej etykiety wewnątrz bloku procedury, jeśli wywołamy porcedure podając w jego miejscu wartość w postaci *etykieta.

Funkcje wbudowane

Fumkcja   Opis
INT   konwersja liczby na liczbę całkowitą
REAL   konwersja liczby do typu rzeczywistego
DBLE   konwersja liczby do typu rzeczywistego podwójnej precyzji
CMLPX   konwersja liczby na typ zespolony.
CHAR   konwersja z liczby całkowitej na znak
CHAR   konwersja znaku do liczby całkowitej
AINT   obcięcie liczby do liczby całkowitej - wynik jest typu rzeczywistego
ANINT   Najbliższa liczba całkowita - wynik jest typu rzeczywistego
NINT   Najbliższa liczba całkowita - wynik jest typu całkowitego
ABS   wartość bezwzględna (także modół liczby zespolonej)
MOD   reszta z dzielenia
SIGN   znak liczby
DIM   różnica dodatnia - wartość bezwzględna z różnicy argumentów)
DPROD   iloczyn dwóch liczb rzeczywistych - wynik podwójnej precyzji
MAX   maksimum - wartość maksymalna z wartości znajdujących sie na liście argumentów
MIN   minimum - wartość minimalna z wartości znajdujących sie na liście argumentów
LEN   zwraca długość tekstu w znakach
INDEX   zwraca pozycję podtekstu w tekscie
LGE, LGT, LLE, LLT   funkcje porównujące teksty. Wynikiem jest wartość logiczna a działają podobnie jak operatory .GE., .GT., .LE., .LT.,
AIMAG   część urojona liczby zespolonej
CONJG   liczba zespolona sprzężona z liczbą podaną jako argument
SQRT   pierwiastek
EXP   eksponenta
LOG   logarytm naturalny
LOG10   logarytm dzisiętny
SIN   sinus kąta, argument wyrażony w radianach
COS   cosinus kąta, argument wyrażony w radianach
TAN   tangens kąta, argument wyrażony w radianach
ASIN   arkus sinus liczby
ACOS   arkus cosinus liczby
ATAN   arkus tangens liczby
ATAN2   arkus tangens ilorazu dwóch liczb
SINH   sinus hiperboliczny
COSH   cosinus hiperboliczny
TANH   tangens hiperboliczny

Przykład programu

C Program poszukujacy liczb pierwszych zaprzyjaznionych metoda 
C sita Eratostenesa. Program jest ilustracja uzycia plikow 
C tymczasowych
      PROGRAM LICZBYPIERWSZE
C N oznacza ile liczb bedziemy przeszukiwac
      PARAMETER(N=10000)
      INTEGER I,J,K,L
C otwieramy plik tymczasowy 
      OPEN(UNIT=9,STATUS='SCRATCH',ACCESS='DIRECT',
     -    FORM='FORMATTED',RECL=3,ERR=900)
C i wypelniamy go od razy pomijajac liczby parzyste oprocz 2
      WRITE(9,700) 1
      WRITE(9,700) 1
      DO 100 J=1,N
        WRITE(9,700) 1
        WRITE(9,700) 0
100   CONTINUE    
      LIMIT=INT(SQRT(REAL(N)))+1
C ustawiamy poczatkowy numer liczby pierwszej
      I=3
C szukamy kolejnej liczby pierwszej
101   CALL POSITION(I)
102   IF (I.GT.LIMIT) GOTO 120
      READ(9,700) L
      IF (L.EQ.0) THEN
        I = I+1
        GOTO 102
      ELSE
C wpisujemy 0 na wszystkie pozycje bedace wielokrotnosciami znalezionej
        DO 110 K=2*I,N,I
          CALL POSITION(K)
          WRITE(9,700) 0
110     CONTINUE
        I = I+1    
        GOTO 101
      END IF
C wypisujemy liczby zaprzyjaznione
120   CALL POSITION(1)
      I=1
      DO 130 J=1,N
        READ(9,700) L
        IF (L.EQ.1) THEN
          IF (J-I.EQ.2) THEN
            WRITE(*,703) I,J
          END IF
          I=J
        END IF
130   CONTINUE
      CLOSE(UNIT=9)
      STOP
C formaty uzywane w programie
700   FORMAT(I1)
701   FORMAT(I12)
702   FORMAT('Blad programu')
703   FORMAT(I10,I10)
C wypisanie komunikatu o bledzie
900   WRITE(*,702)
      STOP
      END
      
C PODPROGRAM USTAWIAJACY WSKAZNIK PLIKU NA WYBRANEJ POZYCJI
      SUBROUTINE POSITION(I)
      INTEGER I,J
      INQUIRE(UNIT=9,NEXTREC=J)
      IF (J-I) 600,610,620
C PRZESUN SIE DO PRZODU      
600   DO 601 K=J,I-1
        READ(9,700) L
601   CONTINUE
C POZYCJA JEST DOBRA
610   RETURN
C PRZESUN SIE DO TYLU
620   REWIND(9)
      DO 622 K=1,I-1
        READ(9,700) L
622   CONTINUE
700   FORMAT(I1)
      END