2015-05-26 2 views
3

Я пытаюсь понять Fortran код, содержащийся в: http://heath.cs.illinois.edu/courses/cs598mh/george_liu.pdfМассивы в подпрограммах, Fortran 77

В частности, переменные массива деклараций в подпрограммах. Вот пример:

 SUBROUTINE ROOTLS (ROOT, XADJ, ADJNCY, MASK, NLVL, XLS, LS) 
C 
     INTEGER ADJNCY(1), LS(1), MASK(1), XLS(1) 
     INTEGER XADJ(1), I, J, JSTOP, JSTRT, LBEGIN 

Я смущен (1) после имени массива, например ADJNCY(1) и XADJ(1). Эти массивы определенно больше одного. Что делает (1) в этих объявлениях?

ответ

3

В самом деле, это не FORTRAN 77, но FORTRAN 66 ;-)

(1) является dirty hack in FORTRAN 66 построить что-то вроде массива с предполагаемого размера. В FORTRAN 77 это стандартизировано до (*).

Предполагаемый размер означает, что фактический массив зависит от длины фактического массива, переданного подпрограмме. Обратите внимание, однако, что форма массива не обязательно сохраняется! Se here за отличное объяснение по этому вопросу.

+0

Wow! Огромное спасибо!!! Я понятия не имел, что код еще старше. :-) – Khubunku

+0

только потому, что кто-то использовал старое соглашение, это не значит, что код старый. Я удивлен заявлением в этой ссылке, в котором говорится, что современные компиляторы запрещают это. intel принимает это. Очевидно, вы не должны продолжать использовать это для нового кода, но нет причин переходить на старый код старой библиотеки, чтобы исправить его. – agentp

+1

@agentp Компилятор принимает его, * если он не проверяет аргументы * (например, с помощью внешних библиотек)! Как только вы предоставите интерфейс функции/подпрограммы (например, использование в модуле), компилятор, безусловно, не примет его. –