Fortran 77 Переменный размер Массив строк? - PullRequest
0 голосов
/ 12 сентября 2011

Я - дурачок в Фортране 77 и всегда был программистом на С ++, но мне нужно изменить код много лет назад ... Я хочу создать массив строк переменного размера и не могу найти в Интернете, как это сделатьэто в Фортране 77. В идеале это должен быть массив с переменными обоих измерений, но если это невозможно, длину строки я могу исправить, но мне нужно иметь переменное количество строк.

Я пробовал это:

CHARACTER*32 STR1*(VAR1)
...
WRITE(6,*) STR1(10)

Но это не работает ...

1 Ответ

0 голосов
/ 12 сентября 2011

Очевидно, что FORTRAN 77 не поддерживает динамическое выделение памяти. Вы можете попытаться выделить память в программе c и передать результат обратно в процедуру FORTRAN.

Как сделано здесь http://owen.sj.ca.us/~rk/howto/FandC/FandC.mem.html

Или, если быть более точным, использование какого-либо Interop для вызова метода c

из Фортрана.

Портативный Unix-компилятор Fortran-77 ('f77') написан почти полностью в C. Второй проход компилятора тот же, который используется компилятор C и большинство библиотечных подпрограмм 'f77' являются просто интерфейсами в соответствующие подпрограммы библиотеки C Тем не менее, так как Фортран не поддерживать структуры данных, подобные тем, которые используются в C, вы не сможете воспользоваться всеми функциями библиотеки «curses» предложения. Управлять окнами с помощью «проклятий» особенно сложно. Если вы заинтересованы в использовании подпрограмм с участием структур данных, вы вероятно, следует использовать C вместо Fortran.

Чтобы вызывать подпрограммы C из программы на Фортране, вам придется написать несколько С кодом. Фортран передает аргументы по ссылке или адресу, поэтому C Функция должна быть готова принять переменную в качестве адреса. это означает, что вам придется писать функции в C, которые вызываются из Фортран, который правильно настроил аргументы перед вызовом библиотеки функция. Схематически это может быть что-то вроде:

Обратите внимание на подчеркивание (_) в названии процедуры.

В исходном файле C:

foo_ (bar) / * Примечание подчеркивание * / int bar; / Примечание переменные прошло по адресу * /

{:}

В исходном файле на Фортране:

call foo (baz) / * Предполагается, что "baz" является целым числом. * / {:}

Подчеркивание важно, потому что Фортран использует символ, чтобы сохранить его символы прямые. Если вы компилируете на RS6000, это не поведение по умолчанию, но компилируется с опцией -qextname на RS6000 заставит его работать идентично другим платформам.

Вызов C из Фортрана

Обратите внимание на пример на Фортране и то, как он вызывает подпрограммы C:

вызовите initscr () вызовите clear (). , , позвонить двигаться (х, у). , , вызов функция refresh () вызывается endwin () end

... где x и y - целые числа, определяющие новые координаты.

Вызов проклятий из Фортрана

Если вы вызывали рутину 'curses' move () ', вы можете сделать как то так:

Исходный файл C содержит подпрограмму интерфейса для curses библиотечная функция 'move ()' вместе с другими функциями C, которые предоставить интерфейс для некоторых других функций curses:

# включает

initscr_ () {initscr (); }

clear_ () {clear (); }

move_ (x, y) int * x, y; / Это указатели * / {move (* x, * У); }

refresh_ () {refresh (); }

endwin_ () {endwin (); }

Подпрограммы компилируются с помощью этих команд:

cc -c curses.c f77 test.f curses.o -lcurses -ltermcap

Если вы используете макросы, определенные в /usr/include/curses.h в вашем Фортран файл, имейте в виду, что они принимают соглашения С язык. Имейте в виду, что это может повлиять на результаты, которые вы получаете, когда используя их в Фортране.

из https://engineering.purdue.edu/ECN/Support/KB/Docs/CallingCFromFortran

...