
- •Управление векторами и матрицами
- •Компиляция и выполнение Компиляция
- •Связывание (редактирование связей )
- •Выполнение
- •Примеры
- •Соглашения о записи кода
- •Арифметические выражения
- •Операции отношения
- •Логические выражения
- •Сравнение символов
- •Переносимость результата
- •Спецификация массивов
- •Сечения массива Индивидуальные элементы
- •Сечения
- •Векторные указатели
- •Память для массива Физическая память:
- •Присваивание массива Присваивание всего массива
- •Присваивание секции (вырезки) массива
- •Повторная нумерация
- •Основные встроенные процедуры
- •Массивы нулевого размера
- •Массивы и производные типы
- •Инициализация массивов Конструкторы
- •Оператор data
- •Встроенные функции для массива
- •Пример упрощения
- •Пример исследования (запроса)
- •Пример конструирования
- •Пример локализации
- •Я Операторы управления
- •Вложения
- •Порядок операторов
- •Синтаксис программы Main
- •Формат представления программы
- •Программные единицы
- •Уровни доступа
- •Дополнения
- •Спецификация входных-выходных параметров
- •Использование модуля
- •Родовые подпрограммы
- •Интерактивный ввод-вывод
- •Простой Input и Output
- •Форматирование по умолчанию
- •Форматированный ввод-вывод I/o
- •Дескрипторы редактора
- •Вещественные - форма с фиксированной точкой
- •Вещественные - экспотенциальная форма
- •Символьные
- •Логические
- •Заполнение пробелами (пропуск символьных позиций)
- •Специальные символы
- •Списки ввода-вывода
- •Производные типы данных
- •Неявный цикл do
- •Ввод-вывод без продвижения
- •Файловый ввод-вывод
- •Номера устройств
- •Операторы read и write
- •Оператор write
- •Оператор open
- •Оператор close
- •Оператор inquirе
- •Динамический массив
- •Распределяемые массивы
- •Спецификация
- •Выделение и возвращение памяти
- •Статус распределяемых массивов
- •Потоки памяти (куча)
- •Что есть указатели?
- •Указатели и адресаты
- •Спецификации указателя Общая форма для операторов определения указателя и адресата такая:
- •Присваивание указателя
- •Разыменование (Dereferencing)
- •Статус (состояние) связи указателя
- •Динамическая память
- •Общие ошибки
- •Указатели в производных типах данных
- •Связанные списки
- •Параметры - указатели
- •Функции для указателей
Списки ввода-вывода
Когда более чем одна переменная пишется или читается в некотором операторе WRITE() или READ(), оператор ссылается на список ввода - вывода. Для вывода могут быть использованы переменные и/или выражения, но для ввода разрешены только переменные. Могут быть использованы неявные циклы DO для любого ввода или вывода, для любых типов данных, в том числе и производныых. Массив может быть специфицирован как задаваемый полностью, или поэлементно, или диапазоном элементов:
INTEGER, DIMENSION(10) :: a
READ (*,*) a(1), a(2), a(3) ! чтение значений с записью в 3 элемента
READ (*,*) a ! чтение 10 значений
READ (*,*) a(5:8) ! чтение значений с записью в 4 элемента
Элементы массива могут появляться только в списке ввода -вывода для ввода. Например:
INTEGER :: b(10), c(3)
c= (/1,2,1/)
READ (*,*) b(c) ! запрещено
Запрещение возникает потому, что b(1) появится дважды.
Я
Производные типы данных
Ввод-вывод в производных типах данных так как если бы компоненты были специфицированы в порядке. Так для p и t типа POINT и TRIANGLE соответственно, где:
TYPE point
REAL :: x, y
END TYPE
TYPE (point) :: pt
!
TYPE triangle
TYPE (point) :: a, b, c
END TYPE
TYPE (triangle) :: tri
следующие две пары опереторов эквивалентны:
READ (*,*) pt
READ (*,*) pt%x, pt%y
...
READ (*,*) tr
READ (*,*) tri%a%x, tri%a%y, tri%b%x, tri%b%y, tri%c%x, tri%c%y
Объект производного типа данных, который содержит указатель, может появиться в списке ввода-вывода. Ограничение этой проблемы связано с рекурсивными типами данных.
Я
Неявный цикл do
Список неявного цикла DO похож на сокращенный вариант конструкции циклаDO. Список неявного цикла DO често используется для представления ввода-вывода, где происходит ввод-вывод массива и он имеет общую форму следующую:
(object, do_var=start, stop [,step])
где do_var целая переменная (и не может быть указателем).
Рассмотрим следующий пример:
INTEGER :: j
REAL, DIMENSION(5) :: a
READ (*,*) ( a(j), j=1,5) ! a(1), a(2), a(3), a(4), a(5)
WRITE (*,*) ( a(j), j=5,1,-1) ! a(5), a(4), a(3), a(2), a(1)
Первый оператор будет читать 5 значений, каждое значение присваивается очередному элементу, начиная с первого. Второй оператор будет читать 5 значений , присваивая ихэлементам массива в обратном порядке
Список неявного цикла может быть таким:
INTEGER :: I, J
REAL, DIMENSION(10,10) :: B
WRITE (*,*) ((B(I,J),I=1,10), J=1,10)
Здесь вид вывода есть альтернатива использованию секции массива.
Я
Ввод-вывод без продвижения
Нормальное действие оператора ввода-вывода состоит в продвижении к следующей записи по завершении оператора. Таким образом на вводе, если запись читалась только частично, остаток вводимой записи сбрасывается. На выводе оператор WRITE() будет завершен на позиции курсора в начале новой строки.
I/O без продвижения позволяет запись читать по частям (например, длинная запись неизвестной длины) или создавать искусный пользовательский интерфейс, где приглашение ввода и ответ пользователя появляется в одной и той же строке (но остерегайтесь, что это "аккуратное средство" не определено в стандарте Fortran и зависит от реализации).
Имеется комплексное множество правил, превращающих использование ввода-вывода без продвижения и его вариантов в соответствующие ключевые слова. Этот раздел имеет смысл только с весьма зависящим от реализации аспектами управления экраном. Ключевое слово ADVANCE должно быть использовано в операторах WRITE или READ следующим образом:
INTEGER :: i, j
...
WRITE(*,*,ADVANCE='NO') 'Введите значение i : '
READ(*,*) i
WRITE(*,*) ''Введите значение j : ' ! ADVANCE='YES'
READ(*,*) j
Если пользователь вводит значения 10 и 20 это должно появиься на экране следующим образом:
Введите значение i : 10
Введите значение j :
20
Ввод-вывод без продвижения выглядит ясно, но зависит от реализации.