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 jest blokiem od którego rozpoczyna się wykonywanie programu. W bloku tym możemy podać nazwę programu, ale ma ona znaczenie komentarza.
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 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.
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 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.
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 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.
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.
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:
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ł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.
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:
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:
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 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 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.
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.
Wykonanie instrukcji STOP powoduje natychmiastowe zakończenie wykonywania programu.
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ę.
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ę.
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?
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.
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:
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- |
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.
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)
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.
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.
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.
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.
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 |
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