Что мне делать с внутренним компонентом FORTRAN, который не был частью стандарта? - PullRequest
4 голосов
/ 04 мая 2011

Я пытаюсь заставить работать старый код FORTRAN, собирая его из исходного кода с помощью gfortran.Я наконец-то смог успешно его построить, но теперь я получаю ошибку за гранью, когда она запускается.Я использовал gdb и отследил ошибку до функции, которая использует встроенную функцию loc ().Когда я пытаюсь напечатать значение loc(ae), где ae - мое переданное целочисленное значение, я получаю ошибку «Нет символа« loc »в текущем контексте».Я попытался скомпилировать с ifort 11.x и отладил с помощью DDT и получил ту же ошибку.Для меня это означает, что компилятор ничего не знает о внутреннем.

Небольшое чтение показало, что loc intrinsic не является частью стандарта F77, так что, возможно, это часть проблемы.Я опубликовал определение встроенной функции ниже, но я не знаю, как я могу внедрить это в свой код, чтобы можно было использовать loc ().

Любой совет или я неправильно понимаю мою проблему?Потому что и gfortran, и ifort аварийно завершают работу в одном и том же месте из-за ошибки за границами, но функция, использующая loc (), возвращает одинаковое большое число между обоими компиляторами.Кажется немного странным, что loc () не будет работать, если оба компилятора отыграют одинаковое значение для loc.

Использование:

iaddr = loc (obj)

Где:

obj - переменная, массив, функция или подпрограмма, чей адрес требуется.iaddr - это целое число с адресом «obj».Адрес находится в том же формате, который хранится в инструкции LARn.

Описание:

LOC используется для получения адреса чего-либо.Возвращаемое значение не очень полезно в Fortran, но может быть необходимо для подпрограмм GMAP или для специальной отладки.

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

Ну, нет, тот факт, что он компилируется, означает, что loc является известным компилятору;тот факт, что GDB не знает об этом, просто означает, что он просто не знает отладчик (который, вероятно, также не знает встроенную matmult).

loc - широко доступныйстандартное расширение.Я ненавижу это.Если вы хотите что-то стандартное, которое должно работать везде, вы можете использовать c_loc , который является частью стандарта взаимодействия C <-> Fortran в Fortran2003.Он возвращает указатель, который может быть передан в подпрограммы C.

Как используется значение из вызова loc?

0 голосов
/ 04 мая 2011

Gfortran loc работает с массивами немного иначе, чем у некоторых других компиляторов.Если вы используете его, например, для проверки копий массива или тому подобное, то может быть лучше сделать loc первого элемента loc (obj (1,1)) или подобного.Это эквивалентно тому, что loc я думаю с intel, но в gfortran он дает вместо этого какой-то другой адрес (поэтому два массива, которые совместно используют одну и ту же схему памяти, имеют разные результаты loc).

...