2.19. Дополнительные возможности языка: дополнительные точки входа, свободный формат, строки отладки, средства консольного ввода-вывода, системное время, случайные числа

В подпрограммах SUBROUTINE и FUNCTION могут быть дополнительные точки входа, которые задаются оператором ENTRY :

ENTRY имя точки входа(список параметров)

Операторы ENTRY могут записываться в любом месте подпрограммы, но не внутри цикла и не внутри условного оператора. Список параметров дополни­тельной точки входа может не совпадать со списком параметров в заголовке подпрограммы. Тип вычисляемого значения (если это функция) также может от­личаться от типа, указанного в заголовке. Но в самом операторе ENTRY задать вычисляемый тип нельзя, это нужно сделать в операторе описания в начале под­программы. Подпрограмму, имеющую дополнительные точки входа, можно вы­звать через любую из этих точек, точно так же, как и по основному имени. Но дополнительные точки входа нельзя передавать другим подпрограммам как ар­гументы.

Метакоманда SFREEFORM позволяет записывать текст программы в так на­зываемом свободном формате. При этом операторы можно размещать в позици­ях с 1-й по 80-ю; метки записываются начиная с 1-й позиции и могут не отде­ляться от оператора пробелом; если последний символ строки то следующая строка считается строкой продолжения; признак комментария -символ " в 1-й позиции.

Строки отладки позволяют осуществлять так называемую условную компи­ляцию, т.е. компилировать не все операторы программы, а лишь некоторое их подмножество. Строка отладки - это любая строка программы, в первой позиции которой записана какая-нибудь латинская буква (кроме буквы C). Для включения режима условной компиляции используется метакоманда SDEBUG. Она может быть задана (в любом месте программы) либо без параметров : SDEBUG , либо с параметром - строкой, состоящей из латинских букв : SDEBUG:'буквы'. В пер­вом случае метакоманда включает расширенную диагностику ошибок времени выполнения (целочисленное переполнение, проверка границ подстрок, проверка индексных выражений элементов массивов и т.д.). Во втором случае метакоман­да включает режим условной компиляции - компилируются только те из строк отладки, которые начинаются буквой, входящей в строку, заданную в SDEBUG, остальные строки отладки считаются комментариями. Отменить действие мета­команды SDEBUG можно либо другой метакомандой SDEBUG, либо метако­мандой SNODEBUG.

В языке FORTRAN есть некоторые средства для работы с текстовыми окна­ми на экране. Они находятся в той же библиотеке, что и графические процедуры и функции, поэтому для их использования необходимо подключить к программе файлы fgraph.fi и fgraph.fd. Процедура SetTextWindow (y1,x1,y2,x2) распреде­ляет текстовое окно на экране, y1,y2 - номера строк, x1,x2 - номера позиций. Для очистки текстового окна используются функция SetBkCoIor и процедура CIearScreen, которые работают как в графическом, так и в текстовом режиме. Положение курсора устанавливает процедура SetTextPosition(y,x,O/pPos), где y,x - номер строки и номер позиции (координаты отсчитываются от левого верхнего угла окна), O/dPos - структурная переменная, через которую возвращаются пре­дыдущие координаты курсора, она должна быть описана как RECORD/rccoord/TextPos. Цвет текста устанавливает функция SetTextCoIor(CoZor). Вывод в текстовое окно осуществляется специальной про­цедурой OutText(text). Процедура выводит только символьные значения, числа должны быть предварительно преобразованы в строку. Не следует использовать совместно с процедурой OutText операторы PRINT и WRITE. Форму курсора можно установить функцией SetTextCursor. Она имеет один параметр типа INTEGER*2, значение #0707 задает тонкий курсор, #0007 - максимально боль­шой ("блочный") курсор, #0607 - нормальный курсор, #2000 - невидимый курсор. При работе с текстовыми окнами нежелательно использование оператора PAUSE, вместо него можно использовать оператор READ(*,*), который ожидает нажатия клавиши Enter (как ReadLn в языке PASCAL). Этот оператор работает и во всех других случаях.

Для получения системного времени служит стандартная подпрограмма-процедура

SUBROUTINE GetTim(h,m,s,s100)

INTEGER*2 h,m,s,s100

где h-часы, m-минуты, s-секунды и s100-сoтые доли секунды.

Случайное вещественное число из отрезка (O,1) возвращает подпрограмма-процедура

SUBROUTINE Random(x) REAL*4 x

Генератор случайных чисел можно инициализировать с помощью подпро­граммы-процедуры

SUBROUTINE Seed(Init) INTEGER*2 Init

При возрастании параметра Init от O до примерно 1OOOO первое значение, возвращаемое генератором случайных чисел, растет от почти нуля до почти еди­ницы, а для больших значений Init этот цикл повторяется. В качестве хорошего инициализатора можно брать величину s100*1OO, где s100 - сотые доли секунды текущего системного времени.