У меня есть проект Fortran 90, который широко использует функцию loc для получения адреса массивов (часть API для взаимодействия с Matlab).LOC и% LOC не работают в подпрограммах на Windows
Этот код компилируется и работает на Mac и Linux с Intel и gfortran, и на некоторое время (через пару разных версий компилятора).
Я теперь пытаюсь построить на Windows с Intel Fortran из Composer XE 2015. Когда я перехожу к отладчику, я вижу, что вызов LOC в моей основной функции правильно возвращает адрес, но вызовы внутри подпрограмм, вызываемых из этого ничего не делать - он просто возвращает значение данных вместо местоположения.
Есть ли у кого-нибудь идеи, почему LOC не будет работать? Я пробовал как с loc(), так и с% LOC() и получал такое же поведение. Например, см. this function. Локаль на линии 69 работает, один на линии 116 не делает (просто возвращает значение данных). REPIDX_0 (X, 1) является макросом препроцессора, который в этом случае просто возвращает X.
Любые советы или указатели будут оценены - я полностью застрял.
Вот минимальный пример:
program testloc
implicit none
real, pointer :: x
integer(8) :: add1, add2
allocate(x)
x = 2
add1 = loc(x)
call get_add(x,add2)
write(*,*) add1
write(*,*) add2
deallocate(x)
contains
subroutine get_add(x,add)
real, pointer, intent(in) :: x
integer(8), intent(out) :: add
add = loc(x)
end subroutine
end program
На Mac/Linux с ifort 12.1.3 Я получаю ожидаемый результат:
MatlabAPI_lite robince$ ./a.out
140661969926608
140661969926608
В Windows с ifort 15.0.1 Я получаю проблематична выход:
c:\code\MatlabAPI_lite>testloc
4636400
2
Показать свой код, пример должен быть * в самом вопросе * (цитируется по причинам, чтобы закрыть как не по теме). –
Вы уже используете 'iso_c_binding' в коде. Почему бы вам не использовать 'type (c_ptr)' и 'c_loc()'? –
Ну, мой вопрос касается не только моего кода, тем более - я отлаживал его и идентифицировал проблему - LOC возвращает значение, а не адрес. Поэтому мой вопрос заключается в том, как это может произойти. Я не помню подробностей, как это было несколько лет назад, но была какая-то причина, почему c_ptr и c_loc не работали для меня - не помните, если это была нехватка поддержки компилятора или какая-то другая проблема. Я могу пересмотреть, что я предполагаю, но я надеялся, что будет легче получить существующий код, построенный на окнах (поскольку он был стабильным в течение многих лет на Mac и Linux) – robince