2015-02-07 6 views
2

У меня есть проект 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 
+2

Показать свой код, пример должен быть * в самом вопросе * (цитируется по причинам, чтобы закрыть как не по теме). –

+0

Вы уже используете 'iso_c_binding' в коде. Почему бы вам не использовать 'type (c_ptr)' и 'c_loc()'? –

+0

Ну, мой вопрос касается не только моего кода, тем более - я отлаживал его и идентифицировал проблему - LOC возвращает значение, а не адрес. Поэтому мой вопрос заключается в том, как это может произойти. Я не помню подробностей, как это было несколько лет назад, но была какая-то причина, почему c_ptr и c_loc не работали для меня - не помните, если это была нехватка поддержки компилятора или какая-то другая проблема. Я могу пересмотреть, что я предполагаю, но я надеялся, что будет легче получить существующий код, построенный на окнах (поскольку он был стабильным в течение многих лет на Mac и Linux) – robince

ответ

2

Это была ошибка компилятора - она ​​исправлена ​​в 15.0.3.

Смежные вопросы