LINUX.ORG.RU

Несколько вопросов по фортрану


0

0

Понадобилось немного модифицировать одну древнюю программу на 
фортране. Знаю о фортране довольно мало. 
Пожалуйста, дайте ссылку на подробную документацию или ответьте на следующие вопросы:

1. Можно ли в gfortran отключить предупреждения об устаревшем синтаксисе,
оставив все остальные предупреждения и ошибки? Главным образом, мешают
сообщения вида:

Warning: Obsolete: arithmetic IF statement at (1)
 In file a.f:5864
   14 IF(TEST)8,16,16

2. Как в g77 и gfortran получить параметры командной строки?

3. Что означают ошибки вида:

A.FOR: In subroutine `tb':
A.FOR:3189:
         CALL SHORT
              ^
Reference to intrinsic function `SHORT' as if it were a subroutine at (^)

и далее

A.FOR: Outside of any program unit:
A.FOR:3189: warning:
         CALL SHORT
              1
A.FOR:4290: (continued):
         SUBROUTINE SHORT
                    2
Same name `short' used for global at (2) and intrinsic at (1) [info -f g77 M INTGLOB]

Имя процедуры в программе совпало с именем в одной из стандартных библиотек? 
Достаточно ли будет переименовать процедуру и все ссылки на неё?

Заранее спасибо.
★★★★

И вдогонку к 1-му вопросу: на что рекомендуется заменять конструкции вида IF(TEST)8,16,20 ?

acheron ★★★★
() автор топика

1. Нужно включить строгую проверку синтаксиса Fortran 77. Кажется, это ключ -f77

2. Не знаю, никогда этого не делал

3. Ошибка вызвана конфликтом имен: в программе вызывается подпрограмма SHORT, имя которой совпадает с имеющейся в библиотеке функцией SHORT(). Возможно, указание синтаксиса Фортрана 77 решит эту проблему, хотя и не факт.

annoynimous ★★★★★
()

2. The following intrinsic procedures are available: COMMAND_ARGUMENT_COUNT(), GET_COMMAND_ARGUMENT(), GET_COMMAND() and GET_ENVIRONMENT_VARIABLE()

Небольшая выдержка из intel fortran-овской документации:

GET_COMMAND

Intrinsic Subroutine: Returns the entire command that was used to invoke the program.

Syntax

CALL GET_COMMAND ([command, length, status])

command (Output; optional) Must be a scalar of type default character. If specified, its value is the entire command that was used to invoke the program. If the command cannot be determined, its value is all blanks.

length (Output; optional) Must be a scalar of type integer. If specified, its value is the significant length of the command that was used to invoke the program. This length includes trailing blanks, but it does not include any truncation or padding used in the command. If the command length cannot be determined, its value is zero.

status (Output; optional) Must be a scalar of type integer. If specified, its value is -1 if the command argument is present and has a length less than the significant length of the command. If the command cannot be retrieved, its value is positive; otherwise, it is assigned the value zero.

See Also

GETARG, NARGS, IARGC, COMMAND_ARGUMENT_COUNT, GET_COMMAND_ARGUMENT

Examples

See the example in COMMAND_ARGUMENT_COUNT

Alexey-ZAR
()
Ответ на: комментарий от annoynimous

Спасибо.

> Кажется, это ключ -f77

Такого ключа gfortran не знает.

После поиска в гугле возникает ощущение, что такой ключ есть во всех компиляторах, КРОМЕ gfortran.

acheron ★★★★
() автор топика
Ответ на: комментарий от Alexey-ZAR

> The following intrinsic procedures are available: COMMAND_ARGUMENT_COUNT(), GET_COMMAND_ARGUMENT(), GET_COMMAND() and GET_ENVIRONMENT_VARIABLE()

Спасибо. Но это только для поддерживающих стандарт фортрана-90? А как с g77?

acheron ★★★★
() автор топика
Ответ на: комментарий от acheron

В Фортране-77 как таковом поддержки аргументов командной строки не было вовсе, то, что я привел, это вообще Fortran2003 feature. Для более ранних стандартов - это разве только расширение конкретного компилятора, а вот с g77 я не работал.

Вместо -f77 можно использовать -std=legacy, этот ключ отключает предупреждения об устаревших функциях.

Alexey-ZAR
()
Ответ на: комментарий от Alexey-ZAR

> -std=legacy

Спасибо!

> В Фортране-77 как таковом поддержки аргументов командной строки не было вовсе

Вот что нашёл: http://www.oc.nps.navy.mil/~bird/web101/fortran/getarg.html

NAME
     getarg, iargc - return Fortran command-line argument

SYNOPSIS
     subroutine getarg(i, c)
     character*N c
     integer*4 i

     integer*4 function iargc()
     integer j

     call getarg(i, c)
     j = iargc()

DESCRIPTION
     getarg returns the i-th command-line argument of the current process.

     iargc returns the index of the last argument.

          foo arg1 arg2 arg3

     getarg(2, c) would return the string ``arg2'' in the character variable
     c.

     iargc would return 3 as the value of the function call.

SEE ALSO
     getopt(3C).

NOTES
     The compiler expects the existence of a Fortran MAIN_ program when these
     functions are used.

Заодно нашёл исходники программы, которая это использовала (SHELX-93).

acheron ★★★★
() автор топика
Ответ на: комментарий от annoynimous

> поставьте g77

Уже стоит. g77 на устарелый синтаксис не ругается. Но когда я на него переключаюсь начинаются проблемы с emerge.

acheron ★★★★
() автор топика

2. Как в g77 и gfortran получить параметры командной строки?

Если пишите под Линукс, то можно попробовать прочитать из /proc/self/cmdline

mky ★★★★★
()
Ответ на: комментарий от mky

> /proc/self/cmdline

Спасибо. Пишу не только под линукс, но может когда пригодится...

acheron ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.