Особенности языка Фортран, взгляд со стороны С

Обратный порядок записи массивов.
a[i,j] в С будет эквивалентен a(j,i) в Фортране, в обоих случаях j будет бежать по строке, i по столбцу при обычной вложенности циклов сначала по i потом по  j.

Аллоцирование массивов в памяти
Неважно какой, статический или динамический массив в Фортране, по умолчанию он будет аллоцирован на стеке. Отсюда наиболее распространненая ошибка, связанная с нехваткой стека при запуске скомпилированных на Фортране программ. Для С программ нужно намного меньше стека и стандартыне linux дистрибутивы настроенны для них. ulimit -s unlimited первое что нужно проверить если программа падает. Для Intel Fortran есть ключ компиляции -heap-arrays , где параметр минимальный размер с которого массивы будут размещаться в куче.

Разнообразие вариантов определения массива
В Фортране есть минимум 4 варианта определения массива.
1. Статический integer :: a(10)
2. Изменяемый integer :: a(n) ,где n определено в этом контексте — аргумент функции или параметризованная переменная.
3. Автоматический размер integer :: a(*) ,применяется при передаче параметров — т.е. будет иметь такой же размер как и передаваемый в ф-цию. Может определять размер одной размерности: b(n, *)
4. Заданной формы integer ::a(:) , размер явно не задан, но задана форма массива, в данном случае одномерный. Или b(:,:) — двумерный, c(:,:,:) -трехмерный и тд.
Разнообразие видов массива часто запутывает gdb при отладке, массивы при этом выводятся некорректно.

Мета-информация для массива
Вместе с самим массивом фортран создает его дескриптор в котором храниться его размерность и размер. В случае передачи в другую функцию это дескриптор может не передаваться (как в случае с заданной формой) и это иногда используется для преобразования размерности массива (передаем 1d, принимаем в ф-ции как 2d). Есть функции которые могут получить метаинформацию по имени массива: SIZE, SHAPE.

Передача аргументов в Фортране
Всё передаётся по ссылке. Так «call foo(a, 1 ,array)» в случае С будет выглядеть как передача указателей: foo(int *a, int* ptr_to_1, int* array).

Автоматическое создание переменных
Legacy-поведение, когда по первой букве неопределенной переменной создается ее описание и таким то типом. Выключается implicit none в каждом исходнике.

Модули фортрана как черный ящик
Фортрановый модуль это фактически аналог С-шного заголовочного файла, но в предкомпилированном бинарном формате. Описание этого формата я не встречал, более того — оно специфично для разных компиляторов и совместимость их не заявлена. Т.е. в любом проекте где используются сторонние модули нужно применять их перекомпиляцию перед использованием. Бывает даже при компиляции приложения фортраном версии X случаются ошибки, если модуль собран компилятором версии X-1.

Свободный формат
В старом формате поле исходника имеет свои поля заданного размера. 4 первых символа строки для меток перехода, 40 символов для кода. Чтобы не забивать себе мозг подобной ерундой — используйе ключ -ffree который включает свободный формат, в котором нет полей.

dmitry

Добавить комментарий