Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GRIGOREV.DOC
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
608 Кб
Скачать
☆

2.16. Структуры

Структуры в языке FORTRAN аналогичны записям в языке PASCAL и структурам в языке C. Структурные переменные описываются в программе в два этапа: сначала описывается структурный тип в операторе STRUCTURE :

STRUCTURE /имя типа/

описания элементов

END STRUCTURE

а затем описываются переменные в специальном операторе RECORD :

RECORD/имя типа/ имя переменной[описатель измерений]...

Допустимы вложенные структуры и массивы структур, структуры могут быть параметрами подпрограмм. Элемент структуры записывается в виде:

имя структуры.имя элемента

точно так же, как в языках PASCAL и C. Целые структуры нельзя вводить или выводить, подобно массивам; для них не работает оператор DATA.

2.17. Динамические массивы

В языке FORTRAN отсутствуют средства для произвольных операций с динамической памятью, как в языках PASCAL и C. Вместо них можно использовать динамически распределяемые (или просто динамические) массивы. Память под такие массивы отводится не при компиляции программы, а по мере необходимости во время выполнения, а после использования может быть освобождена. Динамические массивы описываются со специальным атрибутом ALLOCATABLE :

имя[ALLOCATABLE] описатель измерений

Причем описатель измерений динамического массива имеет вид

( : , : , ... , : )

и задает только размерность массива, которая равна количеству двоеточий (двоеточия разделяются запятыми). Выделяется память для динамического массива оператором ALLOCATE :

ALLOCATE (имя описатель измерений [,STAT=код ошибки])

Описатель измерений в операторе ALLOCATE записывается уже полностью, но, в отличие от обычных массивов, границы измерений могут задаваться любыми выражениями. Существует одно ограничение на использование динамических массивов - их можно использовать как скалярные переменные только в списках ввода-вывода, но не в операторе присваивания и не в арифметических выражениях. Память, отведенная под динамический массив, освобождается оператором DEALLOCATE :

DEALLOCATE (имя[,STAT=код ошибки])

2.18. Графика

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

INCLUDE ‘FGRAPH.FI’

INCLUDE ‘FGRAPH.FD‘

или метакоманды

$INCLUDE:’FGRAPH.FI’

$INCLUDE:’FGRAPH.FD’

для подключения файлов, содержащих описания графических процедур и функций (подпрограммы INTERFACE), а также для описания констант и переменных. Графический режим устанавливается функцией

INTEGER*2 FUNCTION SetVideoMode (mode)

INTEGER*2 mode

Аргумент mode может быть, например, одной из констант:

$MAXRESMODE =-3 - графический режим максимального разрешения;

$MAXCOLORMODE =-2 - графический режим максимальной цветности;

$DEFAULTMODE =-1 - возврат к оригинальному режиму.

Функция возвращает 0 в случае неудачи. Аналогична InitGraph в языках PASCAL и C.

Получить информацию о текущем экранном режиме можно с помощью процедуры:

SUBROUTINE GetVideoConfig(s)

STRUCTURE/videoconfig/

INTEGER*2 numxpixels ! число пикселов по X

INTEGER*2 numypixels ! число пикселов по Y

INTEGER*2 numtextcols ! число текстовых колонок

INTEGER*2 numtextrows ! число текстовых строк

INTEGER*2 numcolors ! число цветов

INTEGER*2 bitsperpixel ! число битов на пиксел

INTEGER*2 numvideopages ! число доступных видеостраниц

INTEGER*2 mode ! текущий видеорежим

INTEGER*2 adapter ! активный адаптер дисплея

INTEGER*2 monitor ! активный монитор

INTEGER*2 memory ! видеопамять адаптера в килобайтах

END STRUCTURE

RECORD/videoconfig/s

Процедура возвращает текущую графическую конфигурацию через структуру s. Поле mode возвращает установленный графический режим. Поле adapter возвращает тип графического адаптера, например, $VGA = 8 . Поле monitor возвращает тип монитора, например, $COLOR или $ENHCOLOR .Фоновый цвет экрана устанавливается функцией

INTEGER*4 FUNCTION SetBkColor (color)

INTEGER*4 color

Подпрограмма

SUBROUTINE ClearScreen(area)

INTEGER*2 area

очищает некоторую область экрана, заполняя ее текущим цветом фона. Параметр area может быть одной из следующих констант:

$GCLEARSCREEN - весь экран,

$GVIEWPORT - текущий видеопорт,

$GWINDOW - текущее текстовое окно.

Текущий цвет для линий и закраски устанавливает функция

INTEGER*2 FUNCTION SetColor(color)

INTEGER*2 color

Вывод пиксела на экран (с использованием текущего цвета) выполняется функцией

INTEGER*2 FUNCTION SetPixel (x,y)

INTEGER*2 x,y

Отрезок прямой от текущего положения графического курсора до точки с координатами x,y рисует функция

INTEGER*2 FUNCTION LineTo (x,y)

INTEGER*2 x,y

Графический курсор перемещается процедурой

SUBROUTINE MoveTo(x,y,s)

INTEGER*2 x,y

STRUCTURE/xycoord/

INTEGER*2 xcoord

INTEGER*2 ycoord

END STRUCTURE

RECORD/xycoord/s

Процедура возвращает через параметр s предыдущее положение графического курсора. Шаблон линии задается процедурой

SUBROUTINE SetLineStyle (mask)

INTEGER*2 mask

Эллиптическая дуга рисуется функцией

INTEGER*2 FUNCTION Arc(x1,y1,x2,y2,x3,y3,x4,y4)

INTEGER*2 x1,y1,x2,y2,x3,y3,x4,y4

Центром эллипса является центр прямоугольника, который определяется точками (x1,y1) и (x2,y2), дуга начинается в точке, (x3,y3), и заканчивается в точке (x4,y4). Эллипс рисуется функцией

INTEGER*2 FUNCTION Ellipse(control,x1,y1,x2,y2)

INTEGER*2 control,x1,y1,x2,y2

Центром эллипса является центр ограничивающего прямоугольника, определяемого точками (x1,y1) и (x2,y2). Аргумент control может быть одной из двух констант:

$GFILLINTERIOR - эллипс закрашивается,

$GBORDER - эллипс не закрашивается.

Прямоугольник рисуется функцией

INTEGER*2 FUNCTION Rectangle (control,x1,y1,x2,y2)

INTEGER*2 control,x1,y1,x2,y2

Замкнутая область закрашивается функцией

INTEGER*2 FUNCTION FloodFill(x,y,boundary)

INTEGER*2 x,y,boundary

Функция аналогична FloodFill в языках PASCAL и C. Способ закрашивания устанавливается процедурой

SUBROUTINE SetFillMask(mask)

INTEGER*1 mask

где mask - массив из 8 элементов типа INTEGER*1, который определяет шаблон закраски области 8 на 8 пикселов. Если маска заполнения не установлена или массив нулевой, то для заполнения используется текущий цвет. Текст на графический экран выводится процедурой

SUBROUTINE OutGText(text)

CHARACTER*(*) text

Текст выводится с использованием текущего шрифта, текущей графической позиции и текущего цвета. После вывода текста сохраняется текущая графическая позиция. Текст позиционируется по левому верхнему краю. Кроме того язык FORTRAN позволяет пользоваться в графическом режиме и обычными операторами PRINT и WRITE. Текущее положение графического курсора возвращает процедура

SUBROUTINE GetCurrentPosition (s)

RECORD/xycoord/s

Ширину текста в пикселах возвращает функция

INTEGER*2 FUNCTION GetGTextExtent(text)

CHARACTER *(*) text

Подключение графических шрифтов осуществляет функция

INTEGER*2 FUNCTION RegisterFonts (PathToFiles)

CHARACTER*(*) PathToFiles

Файлы с графическими шрифтами имеют расширение fon и должны быть доступны программе. Функция возвращает положительное число, равное номеру последнего зарегистрированного шрифта при успешной регистрации. Отрицательное число означает : -1 - файл не найден; -2,-3 - один или несколько файлов ошибочны. Графические шрифты отключаются процедурой

SUBROUTINE UnRegisterFonts()

Текущий шрифт устанавливается функцией

INTEGER*2 FUNCTION SetFont (options)

CHARACTER *(*) options

Она устанавливает один из зарегистрированных шрифтов, который характеризуется параметром options. Строка options может содержать подстроки:

t’fontname’ - имя шрифта;

hx - высота символа в пикселах для масштабируемых шрифтов;

wx - ширина символа в пикселах для масштабируемых шрифтов;

nx - номер шрифта.

2.19. Дополнительные возможности языка:

дополнительные точки входа, свободный формат,

строки отладки, средства консольного ввода-вывода,

системное время, случайные числа

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

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

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

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

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

В языке FORTRAN есть некоторые средства для работы с текстовыми окнами на экране. Они находятся в той же библиотеке, что и графические процедуры и функции, поэтому для их использования необходимо подключить к программе файлы fgraph.fi и fgraph.fd. Процедура SetTextWindow (y1,x1,y2,x2) распределяет текстовое окно на экране, y1,y2 - номера строк, x1,x2 - номера позиций. Для очистки текстового окна используются функция SetBkColor и процедура ClearScreen, которые работают как в графическом, так и в текстовом режиме. Положение курсора устанавливает процедура SetTextPosition(y,x,OlpPos), где y,x - номер строки и номер позиции (координаты отсчитываются от левого верхнего угла окна), OldPos - структурная переменная, через которую возвращаются предыдущие координаты курсора, она должна быть описана как RECORD/rccoord/TextPos. Цвет текста устанавливает функция SetTextColor(Color). Вывод в текстовое окно осуществляется специальной процедурой 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-сотые доли секунды.

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

SUBROUTINE Random(x)

REAL*4 x

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

SUBROUTINE Seed(Init)

INTEGER*2 Init

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]