<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mera400.pl/index.php?action=history&amp;feed=atom&amp;title=CSL-CROOK_-_Struktura_programu</id>
	<title>CSL-CROOK - Struktura programu - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mera400.pl/index.php?action=history&amp;feed=atom&amp;title=CSL-CROOK_-_Struktura_programu"/>
	<link rel="alternate" type="text/html" href="https://mera400.pl/index.php?title=CSL-CROOK_-_Struktura_programu&amp;action=history"/>
	<updated>2026-05-01T12:26:07Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://mera400.pl/index.php?title=CSL-CROOK_-_Struktura_programu&amp;diff=1088&amp;oldid=prev</id>
		<title>Amo: Utworzono nową stronę &quot;= Działania oraz bieg czasu =  Część programu reprezentująca dynamiczne działanie modelu składa się z listy działań. Każde działanie jest odcinkiem programu,...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mera400.pl/index.php?title=CSL-CROOK_-_Struktura_programu&amp;diff=1088&amp;oldid=prev"/>
		<updated>2013-08-31T14:32:32Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;= Działania oraz bieg czasu =  Część programu reprezentująca dynamiczne działanie modelu składa się z listy działań. Każde działanie jest odcinkiem programu,...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Działania oraz bieg czasu =&lt;br /&gt;
&lt;br /&gt;
Część programu reprezentująca dynamiczne działanie modelu składa się z listy działań. Każde działanie jest odcinkiem programu, który dokonuje szeregu zmian w modelu, o ile spełnione są określone warunki początkowe. Działanie jest zatem zazwyczaj poprzedzone jedną lub kilkoma instrukcjami testów, które decydują czy dane działanie może zostać wykonane. Jeżeli testy te nie dadzą wyniku pozytywnego, wówczas dokonywany jest skok do następnego działania. Skok ten jest zazwyczaj wykonywany automatycznie przy pomocy pustej części adresowej. Jedna realizacja programu modelującego składa się najczęściej ze znacznej liczby &amp;quot;przejść&amp;quot; przez listę działań. Przy każdym &amp;quot;przejściu&amp;quot; każde działanie wykonywane jest tylko przy spełnieniu warunków początkowych. Większość układów analizowanych na drodze modelowania, to układy uwarunkowane czasowo. W języki CSL przewidziano zatem mechanizm dla reprezentowania upływu czasu. Mimo ,że zmiany w układzie rzeczywistym mogą zachodzić w sposób ciągły, to w modelu opisanym przy pomocy języka CSL, przyjmie się, że zmiany zachodzą natychmiastowo w dyskretnych momentach czasu. W odcinkach czasu między tymi momentami, żadne zmiany nie występują. Tak więc upływ czasu następuje dyskretnymi odcinkami i jest realizowany następująco. Początkowo oraz w interwałach podczas wykonywania programu, jeden lub więcej atrybutów czasowych zdefiniowanych w modelu ma przypisane pewne wartości. Każda z tych wartości reprezentuje czas, jaki musi upłynąć przed zmianą stanu obiektu lub przed rozpoczęciem jakiegoś procesu. Program realizujący bieg czasu sprawdza wszystkie atrybuty czasowe i wybiera z nich najmniejszą wartość dodatnią, ignorując zero i wartości ujemne. Znaleziona w ten sposób wartość reprezentuje czas, jaki powinien upłynąć przed pojawieniem się jakiejkolwiek zmiany w modelu. Tak więc &amp;quot;czas modelowy&amp;quot; musi zostać zwiększony o tę  wartość. Czas modelowy reprezentuje zmienna o nazwie CLOCK (zegar), która nie musi być definiowana w programie, lecz w razie potrzeby może być w programie użyta. Zmienna CLOCK ma początkowo wartość równą zero, a następnie przy każdym przyroście czasu jest zwiększana o znalezioną wartość, która jest równocześnie odejmowana od wartości wszystkich dodatnich atrybutów czasowych, tak że wartość wybranego atrybutu czasowego staje się w tym momencie równa zeru. Opisany &amp;quot;bieg czasu&amp;quot; jest realizowany przy końcu każdego przejścia przez listę działań, aż do momentu, w którym przy wykonaniu działania pojawia się instrukcja &amp;#039;&amp;#039;&amp;#039;EXIT&amp;#039;&amp;#039;&amp;#039; lub &amp;#039;&amp;#039;&amp;#039;RECYCLE&amp;#039;&amp;#039;&amp;#039; lub wartość wszystkich atrybutów czasowych są niedodatnie. W tym ostatnim przypadku następuje zakończenie obliczeń, sygnalizowane komunikatem na końcówce użytkownika:&lt;br /&gt;
&lt;br /&gt;
 EXIT - CLOCK&lt;br /&gt;
&lt;br /&gt;
Działanie instrukcji &amp;#039;&amp;#039;&amp;#039;EXIT&amp;#039;&amp;#039;&amp;#039; i &amp;#039;&amp;#039;&amp;#039;RECYCLE&amp;#039;&amp;#039;&amp;#039; opisano w dalszej części niniejszego rozdziału.&lt;br /&gt;
&lt;br /&gt;
== ACTIVITIES - działanie ==&lt;br /&gt;
&lt;br /&gt;
Instrukcja:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;ACTIVITIES&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
określa początek odcinka programu zawierającego działania. Instrukcja ta sygnalizuje translatorowi, że należy włączyć do generowanego programu instrukcje biegu czasu i powtarzania. Pozostała część programu, aż do końcowej instrukcji &amp;#039;&amp;#039;&amp;#039;END&amp;#039;&amp;#039;&amp;#039;, jest traktowana jako lista działań, i jest wykonywana wielokrotnie.&lt;br /&gt;
&lt;br /&gt;
== BEGIN - początek ==&lt;br /&gt;
&lt;br /&gt;
Rozpoczęcie każdego działania jest określone instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;BEGIN &amp;lt;identyfikator&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Głównym zadaniem tej instrukcji jest określenie adresu dla każdej pustej części adresowej w poprzednim działaniu. Po słowie &amp;#039;&amp;#039;&amp;#039;BEGIN&amp;#039;&amp;#039;&amp;#039; może następować identyfikator zawierający do 18 znaków (łącznie ze spacjami). Identyfikator ten może być  wyprowadzany jako informacja diagnostyczna przy każdym wykonaniu danej czynności. W pierwszym działaniu instrukcja &amp;#039;&amp;#039;&amp;#039;BEGIN&amp;#039;&amp;#039;&amp;#039; może być pominięta.&lt;br /&gt;
&lt;br /&gt;
== RECYCLE ==&lt;br /&gt;
&lt;br /&gt;
Może się zdarzyć,że jedno działanie dokonuje takich zmian w modelu, które umożliwiają wykonanie poprzednich działań. Jeśli sytuacja taka jest możliwa, to do działania można włączyć instrukcję:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;RECYCLE &amp;lt;identyfikator&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli podczas realizacji działań napotkana zostanie jedna lub więcej instrukcji &amp;#039;&amp;#039;&amp;#039;RECYCLE&amp;#039;&amp;#039;&amp;#039;, wówczas przed następnym przyrostem czasu zostaje ponownie przetworzona cała lista działań. Instrukcja RECYCLE może występować w programie dowolną ilość razy. Powtarzanie listy działań kontynuuje się do momentu, gdy podczas powtórzenia nie spotka się żadnej instrukcji &amp;#039;&amp;#039;&amp;#039;RECYCLE&amp;#039;&amp;#039;&amp;#039;. Uważa się wówczas,że nie może już wykonać dalszych zmian, po czym wprowadza się kolejny przyrost czasu. Po instrukcji RECYCLE może występować do 18 znaków (łącznie ze spacjami), które mogą być  wyprowadzone jako informacja diagnostyczna przy każdym napotkaniu tej instrukcji.&lt;br /&gt;
&lt;br /&gt;
== EXIT - wyjście ==&lt;br /&gt;
&lt;br /&gt;
Instrukcja:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;EXIT&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
jest używana do zakończenia wykonywania programu. Jeśli zostanie napotkana instrukcja &amp;#039;&amp;#039;&amp;#039;EXIT&amp;#039;&amp;#039;&amp;#039; na monitorze użytkownika pojawia się komunikat:&lt;br /&gt;
&lt;br /&gt;
 EXIT - OK&lt;br /&gt;
&lt;br /&gt;
== POSTMORTEM ==&lt;br /&gt;
&lt;br /&gt;
W odcinku programu następującym po instrukcji &amp;#039;&amp;#039;&amp;#039;ACTIVITIES&amp;#039;&amp;#039;&amp;#039; może występować dowolna ilość fragmentów post-mortem. Zadaniem tych działań jest zawarcie instrukcji, które powinny być wykonane w przypadku przekłamań lub innych nieprzewidzianych zdarzeń w czasie wykonywania programu lub na zakończenie jego wykonywania, ale ignorowanych w innych przypadkach. Działanie post-mortem jest deklarowane instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;POSTMORTEM &amp;lt;identyfikator&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i ulega zakończeniu przy pomocy instrukcji:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;PMEND&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instrukcja &amp;#039;&amp;#039;&amp;#039;POSTMORTEM&amp;#039;&amp;#039;&amp;#039; musi być opatrzona etykietą. Działanie &amp;#039;&amp;#039;&amp;#039;POSTMORTEM&amp;#039;&amp;#039;&amp;#039; nie jest, jak inne działania, uruchamiane automatycznie. Istnieją dwa sposoby uruchamiania tego działania:&lt;br /&gt;
&lt;br /&gt;
* może być dokonany skok do instrukcji &amp;#039;&amp;#039;&amp;#039;POSTMORTEM&amp;#039;&amp;#039;&amp;#039;, jednak pod warunkiem, że instrukcja skoku określa wyraźnie etykietę instrukcji &amp;#039;&amp;#039;&amp;#039;POSTMORTEM&amp;#039;&amp;#039;&amp;#039;. Pusta część adresowa w działaniu poprzedzającym nie spowoduje skoku do instrukcji &amp;#039;&amp;#039;&amp;#039;POSTMORTEM&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* etykieta instrukcji &amp;#039;&amp;#039;&amp;#039;POSTMORTEM&amp;#039;&amp;#039;&amp;#039; może być określona jako miejsce wejścia do programu.&lt;br /&gt;
&lt;br /&gt;
Jeżeli zostanie napotkana instrukcja &amp;#039;&amp;#039;&amp;#039;PMEND&amp;#039;&amp;#039;&amp;#039;, wówczas program zatrzyma się a na monitorze pojawi się komunikat:&lt;br /&gt;
&lt;br /&gt;
 HALTED: - PM&lt;br /&gt;
&lt;br /&gt;
= Segmentacja programów =&lt;br /&gt;
&lt;br /&gt;
Program w języku CSL może być pisany i kompilowany segmentami w taki sposób jak program w FORTRANIE. Rozróżniamy cztery rodzaje segmentów:&lt;br /&gt;
&lt;br /&gt;
* segment &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* segment &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* segment &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* segment &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Segmenty mogą być zapisywane w języku FORTRAN lub języku CSL. Jedynie segment &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039; może być pisany wyłącznie w języku FORTRAN. Dokładny opis tego segmentu użytkownik znajdzie w opisie języka FORTRAN.&lt;br /&gt;
&lt;br /&gt;
== Segment MASTER ==&lt;br /&gt;
&lt;br /&gt;
Każdy program w języku CSL musi zawierać jeden i tylko jeden segment &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039;. Segment ten rozpoczyna się instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;MASTER &amp;lt;nazwa&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;tt&amp;gt;nazwa&amp;lt;/tt&amp;gt; może być dowolnym ciągiem znaków. Podobnie jak wszystkie inne segmenty segment &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039; musi kończyć się instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;END&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Segment &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039; jest segmentem sterującym programu, ale może on być też jedynym segmentem w programie. Realizacja programu zaczyna się od pierwszej wykonalnej instrukcji w segmencie &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039;. Może być następnie wykonany skok do innych segmentów za pomocą instrukcji &amp;#039;&amp;#039;&amp;#039;CALL&amp;#039;&amp;#039;&amp;#039; (wołanie) lub wywołań segmentów &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039;. W wyniku działania segmentu &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039; i &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039; może być dokonany skok z powrotem do segmentu &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039; może być  dokonany skok do innych segmentów, ale nie może być dokonany skok z powrotem do segmentu &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039; w sposób inny niż przy użyciu instrukcji &amp;#039;&amp;#039;&amp;#039;RETURN&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Segment SUBROUTINE ==&lt;br /&gt;
&lt;br /&gt;
Segment SUBROUTINE musi mieć postać kompletnego niezależnego programu w tym sensie, że wszystkie występujące w nim zmienne typu REAL, klasy, zbiory, tablice, rozkłady lub histogramy muszą być określone w ramach segmentu poprzez odpowiednie instrukcje definiujące. Wartości związane z każdą z tych pozycji mogą być przesyłane do segmentu z innych segmentów poprzez umieszczenie tych pozycji we wspólnym określonym instrukcją COMMON bloku pamięciowym lub poprzez specyfikację ich jako argumentów instrukcji SUBROUTINE. Segment SUBROUTINE może zawierać dowolne instrukcje z wyjątkiem &amp;#039;&amp;#039;&amp;#039;MASTER&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039; i &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039;. Segment &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039; musi kończyć się instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;END&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pierwszą instrukcją segmentu &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039; musi być instrukcja &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039; (podprogram) następującej postaci:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;SUBROUTINE $&amp;lt;nazwa&amp;gt; (&amp;lt;parametry&amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;tt&amp;gt;nazwa&amp;lt;/tt&amp;gt; jest dowolną nazwą segmentu i musi być  poprzedzona znakiem &amp;quot;$&amp;quot;. Po każdym ciągu znaków numerycznych (napisie) występującym w nazwie musi także następować znak &amp;quot;$&amp;quot;. Parametry są argumentami formalnymi; podczas wykonywania segmentu programu każdy z tych argumentów jest zastępowany przez odpowiednie argumenty aktualne określane w instrukcji &amp;#039;&amp;#039;&amp;#039;CALL&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Skok do segmentu &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039; jest dokonywany za pomocą instrukcji &amp;#039;&amp;#039;&amp;#039;CALL&amp;#039;&amp;#039;&amp;#039; wołanie o postaci:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;CALL $&amp;lt;nazwa&amp;gt; (&amp;lt;parametry&amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie nazwa jest nazwą wołanego segmentu &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039;, natomiast parametry są argumentami aktualnymi, które mają zastąpić odpowiadające im argumenty formalne w obrębie segmentu &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039;. Argumenty aktualne muszą odpowiadać pod względem ilości, porządku oraz typu argumentom formalnym, które mają zastąpić.&lt;br /&gt;
&lt;br /&gt;
Przykłady:&lt;br /&gt;
&lt;br /&gt;
 SUBROUTINE $PODPRO $(A, B, X, Y)&lt;br /&gt;
 CALL $PODPRO (ZMIENNA, MAT1, XXX, Y)&lt;br /&gt;
&lt;br /&gt;
Instrukcja:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;RETURN&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
występuje normalnie co najmniej jeden raz w każdym segmencie &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039;. W wyniku działania tej instrukcji dokonywany jest skok do instrukcji następującej bezpośrednio po instrukcji &amp;#039;&amp;#039;&amp;#039;CALL&amp;#039;&amp;#039;&amp;#039; w segmencie wywołującym.&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&lt;br /&gt;
 SUBROUTINE WYDRUK (ZBIORA)&lt;br /&gt;
 CLASS X.20 SET ZBIORA&lt;br /&gt;
 FOR I=ZBIORA&lt;br /&gt;
 WRITE(3,10)I&lt;br /&gt;
 10 FORMAT(1X, I4)&lt;br /&gt;
 RETURN&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Podprogram ten powoduje wydrukowanie indeksów obiektów elementów wyspecyfikowanego zbioru. Klasa X została wymyślona jedynie dla nadania wymiaru zbiorowi formalnemu &amp;lt;tt&amp;gt;ZBIORA&amp;lt;/tt&amp;gt;; argumentem aktualnym dla programu może być każdy zbiór. Podprogram ten może być wywoływany przykładowo instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;CALL $WYDRUK (WOLLA)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
i zostanie następnie wykonany z operowaniem na elementach zbioru &amp;lt;tt&amp;gt;WOLLA&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Segment FUNCTION ==&lt;br /&gt;
&lt;br /&gt;
Segment &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039; jest podobny do segmentu &amp;#039;&amp;#039;&amp;#039;SUBROUTINE&amp;#039;&amp;#039;&amp;#039; z wyjątkiem tego, że daje on tylko pojedynczy wynik liczbowy. Następuje skok do segmentu &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039; zawsze wtedy, gdy pojawia się nazwa funkcji; funkcja jest wówczas obliczana, a otrzymany wynik liczbowy zostaje podstawiony w miejsce nazwy funkcji w punkcie jej występowania w segmencie wywołującym. Nazwa funkcji może też występować w wyrażeniach wszędzie tam, gdzie dopuszczalne jest występowanie nazwy zmiennej.&lt;br /&gt;
&lt;br /&gt;
Tak więc, jeśli w programie wystąpi instrukcja następująca:&lt;br /&gt;
&lt;br /&gt;
 A-X+$FUNKCJA (X, Y)&lt;br /&gt;
&lt;br /&gt;
wówczas dokonywany jest skok do segmentu &amp;#039;&amp;#039;&amp;#039;FUNCTION&amp;#039;&amp;#039;&amp;#039; o nazwie $FUNKCJA. Segment &amp;lt;tt&amp;gt;$FUNKCJA&amp;lt;/tt&amp;gt; dokonuje odpowiednich operacji na bieżących wartościach X i Y w celu otrzymania wyniku liczbowego; tak uzyskana wartość zostanie następnie podstawiona na miejsce $funkcja w powyższym wyrażeniu. Dopiero po tym zostanie w normalny sposób obliczona wartość całego wyrażenia. Segment funkcyjny musi rozpoczynać się instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;FUNCTION $&amp;lt;NAZWA&amp;gt; (&amp;lt;PARAMETRY&amp;gt;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie nazwa jest dowolną nazwą funkcji używanej w wyrażeniu. Bezpośrednio po każdym ciągu znaków cyfrowych występujących w nazwie musi być umieszczony następny znak &amp;quot;$&amp;quot;. Typ funkcji, tzn. fakt czy wynik będzie typu REAL czy też typu INTEGER jest oznaczony pierwszą literą nazwy. Jeśli wynik ma być  typu INTEGER, wówczas pierwszą literą nazwy musi być I, J, K, L, M lub N; każda inna litera początkowa oznacza wynik typu REAL. Parametry są argumentami formalnymi, które po obliczeniu funkcji są zastępowane argumentami aktualnymi. W instrukcji musi występować co najmniej jeden argument. Wartość otrzymana z segmentu FUNCTION jest podstawiana w segmencie wywołującym w miejsce, gdzie występuje wywołanie zdefiniowanej funkcji. Dla zrealizowania tego podstawienia nazwa funkcji jest traktowana jako nazwa zmiennej w segmencie FUNCTION i musi mieć przyporządkowaną wartość w instrukcji podstawienia.&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&lt;br /&gt;
 FUNCTION $FUNKCJA (X, Y)&lt;br /&gt;
 .......&lt;br /&gt;
 .......&lt;br /&gt;
 $FUNKCJA=3*Y+4*X-(X+Y)&lt;br /&gt;
 RETURN&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
Słowo RETURN musi wystąpić w celu dokonania skoku z powrotem do segmentu wywołującego, natomiast słowo &amp;#039;&amp;#039;&amp;#039;END&amp;#039;&amp;#039;&amp;#039; musi być  ostatnią instrukcją w segmencie.&lt;br /&gt;
&lt;br /&gt;
== Wspólny obszar pamięci ==&lt;br /&gt;
&lt;br /&gt;
Instrukcja ma następującą postać:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;COMMON /nblock/lista [/nblock/lista/]...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;tt&amp;gt;nblock&amp;lt;/tt&amp;gt; jest nazwą bloku &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039;, natomiast &amp;lt;tt&amp;gt;lista&amp;lt;/tt&amp;gt; jest listą zmiennych. Instrukcja &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039; pozwala programiście w taki sposób przydzielać pewne obszary w pamięci, aby były one dostępne dla więcej niż jednego segmentu, tak że wartości otrzymane w jednym mogą być użyte w innym. Nazwa bloku musi składać się ze znaków literowych w liczbie do 12. Każda lista zmiennych może zawierać  tablice, klasy, zbiory oraz tablice-T pod warunkiem, że są one zdefiniowane odpowiednimi instrukcjami deklarującymi przed instrukcją &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039; w tych segmentach, w których one występują. Każda nowa nazwa bloku występująca w instrukcji &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039; definiuje wspólny obszar pamięci zawierający odpowiednią  listę zmiennych wyspecyfikowanych po tej nazwie bloku. Jeżeli ta sama nazwa bloku wystąpi w instrukcji &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039; innego segmentu, wówczas zmienne na nowej liście są przyporządkowane temu samemu obszarowi pamięci. Nowa lista może zawierać zmienne o różnych nazwach i różnych typach , jeśli to potrzebne; wykorzystywanie tego udogodnienia wymaga jednak szczególnej uwagi ze strony programisty. Dopuszcza się istnienie jednego bloku wspólnego o pustej nazwie zdefiniowanego w instrukcji &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039; przy pomocy dwóch pisanych obok siebie (bez spacji) kresek pochyłych. Jeżeli pustą ma być pierwsza nazwa bloku w instrukcji &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039;, wówczas symbole &amp;quot;/&amp;quot; mogą być opuszczone.&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&lt;br /&gt;
jeżeli instrukcja:&lt;br /&gt;
&lt;br /&gt;
 COMMON A, B, C/CSL/D, E, F&lt;br /&gt;
&lt;br /&gt;
występuje w jednym segmencie programu a instrukcje:&lt;br /&gt;
&lt;br /&gt;
 ARRAY Z(3), Y(3)&lt;br /&gt;
 COMMON //Z/CSL/Y&lt;br /&gt;
&lt;br /&gt;
występują w innym segmencie, wówczas Z(1) oraz A mogą być przydzielone do tego samego obszaru pamięci, Z(2) oraz B mogą mieć też wspólną lokację w pamięci.&lt;br /&gt;
&lt;br /&gt;
== Wartości początkowe ==&lt;br /&gt;
&lt;br /&gt;
Instrukcja DATA jest instrukcją nie przeznaczoną do wykonywania, lecz używaną do deklarowania wartości początkowych poszczególnych zmiennych. Instrukcja ta ma następującą postać:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;DATA a1/d1/ [, a2/d2/....]&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie każde a jest listą zmiennych a każde d jest listą  wartości, które mają być tym zmiennym przyporządkowane. Lista zmiennych może zawierać atrybuty i atrybut czasu. Ograniczenia dotyczące listy wartości są takie same jak w FORTRANIE-CROOK.&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&lt;br /&gt;
 DATA A, B(1), T. C/2*1,99/ , STATEK.1(1)/20/&lt;br /&gt;
 ARRAY E(5)&lt;br /&gt;
 DATA E/3*0,2*1/&lt;br /&gt;
&lt;br /&gt;
== Segment BLOCK DATA ==&lt;br /&gt;
&lt;br /&gt;
Segment &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039; jest używany dla nadania wartości początkowych pozycjom w blokach &amp;#039;&amp;#039;&amp;#039;COMMON&amp;#039;&amp;#039;&amp;#039; za pośrednictwem instrukcji &amp;#039;&amp;#039;&amp;#039;DATA&amp;#039;&amp;#039;&amp;#039;. Segment &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039; musi zaczynać się instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;BLOCK DATA&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
a kończyć instrukcją:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;END&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oprócz wyżej wymienionych w segmencie &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039; mogą występować tylko i wyłącznie następujące instrukcje:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;ARRAY, FLOAT, CLASS, COMMON, DATA&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Należy zwrócić uwagę, że segment &amp;#039;&amp;#039;&amp;#039;BLOCK DATA&amp;#039;&amp;#039;&amp;#039; jest jedynie środkiem dostarczania informacji dla translatora programu; nie jest on nigdy wywoływany i może nie zawierać żadnej instrukcji wykonawczej.&lt;br /&gt;
&lt;br /&gt;
Przykład:&lt;br /&gt;
&lt;br /&gt;
 BLOCK DATA&lt;br /&gt;
 CLASS TIME STATEK.4(3)&lt;br /&gt;
 ARRAY WODA(4)&lt;br /&gt;
 FLOAT X&lt;br /&gt;
 COMMON /CSL1/STATEK, T. STATEK/CSL2/WODA, X&lt;br /&gt;
 DATA STATEK/12*1/, T. STATEK.2, T. STATEK.3/1,2/&lt;br /&gt;
 DATA WODA/2*1, 2*2/, X/3.2/&lt;br /&gt;
 END&lt;br /&gt;
&lt;br /&gt;
{{source|title=Translator języka CSL-CROOK dla minikomputera MERA-400 w systemie operacyjnym CROOK-4, Instrukcja Programisty (wersja-17/2)|author=Janusz Gocałek, Jacek Klauziński|date=Poznań, 1985}}&lt;/div&gt;</summary>
		<author><name>Amo</name></author>
	</entry>
</feed>