Ошибка Fortran90: атрибут EXTERNAL конфликтует с атрибутом DIMENSION - PullRequest
2 голосов
/ 17 сентября 2010

Я написал функцию, которая вычисляет собственные значения матрицы 2 * 2. Он принимает матрицу 2 * 2 в качестве аргумента и возвращает 2 собственных значения через массив из 2 элементов. Я объявил функцию в программном блоке так:

real, dimension(2), external :: eigenvalues

Но он не скомпилируется, возникает ошибка:

Error: EXTERNAL attribute conflicts with DIMENSION attribute

Разве невозможно иметь функции, возвращающие массивы, или я что-то не так делаю?

Любая помощь / предложения приветствуются, спасибо. Если это поможет, я использую fortran 90 с компилятором gfortran

Ответы [ 2 ]

1 голос
/ 17 сентября 2010

Скромно расширяя два других ответа, я думаю, что другие подходы обычно предпочтительнее старых «внешних».(В «Справочнике по Фортрану 2003» указан как минимум один случай, в котором необходимо использовать «внешний».) Как уже предлагалось, для собственного исходного кода поместите процедуры (функции и подпрограммы) в раздел содержимого модуля и затемЭто.Это автоматически сделает интерфейс ваших процедур явным, чтобы компилятор мог проверить совместимость между аргументами в вызовах и фиктивными аргументами процедуры - это может отловить много ошибок программиста.Если по какой-то причине у вас нет доступа к исходному коду Fortran, например, вы ссылаетесь на библиотеку или вызываете C, то я бы написал оператор интерфейса, описывающий процедуру.Это сообщит компилятору, что объявленное имя является функцией или программой, и определит интерфейс, разрешающий проверку аргументов.Я сделал бы это только тогда, когда метод модуля невозможен, потому что он более трудоемкий и подвержен ошибкам, когда вносятся изменения, потому что необходимо изменить два элемента.что согласно «Руководству по Fortran 2003» использование внешнего атрибута не предоставляет явного интерфейса, и явный интерфейс требуется для функции, возвращающей аргумент массива.Я не знаю, почему интерфейс считается неявным в этом случае.

1 голос
/ 17 сентября 2010

Документация компилятора Intel Fortran говорит мне, что EXTERNAL несовместим с DIMENSION, что примерно то, что говорит вам ваш компилятор.Я быстро взглянул на стандарт Fortran 2003, но не смог однозначно истолковать его по этому вопросу - поэтому я согласен с Intel и утверждаю, что то, что вы пытаетесь сделать, нестандартно.

Вы, конечно, можете писать функции, которые возвращают массивы.

Мне немного странно, что вы написали функцию EIGENVALUES, а затем пытаетесь объявить ее ВНЕШНЕЙ.Обычно я помещаю определения своих функций либо в раздел CONTAINS внутри более крупного программного модуля, либо в МОДУЛЬ, который использует вызывающий модуль.Ни в том, ни в другом случае мне не нужно объявлять что-либо ВНЕШНЕЕ.

Где источник EIGENVALUES по сравнению с источником вызывающей программы?

...