Сбой вызова функции исправлен операторами печати

Я компилирую программу Fortran для Windows с Visual Studio 2012 и Intel Fortran 2013. В программе я вызываю функцию C, которая является частью статической библиотеки:

call myfunction(arg1,arg2,...);

Когда я запускаю в режиме отладки, все в порядке. Когда я запускаю его в режиме выпуска, программа падает во время вызова этой функции (я проверяю ее, выводя на экран до/после вызова) со следующей ошибкой:

forrtl: severe (157): Program Exception - access violation

Теперь интересная часть, если я добавлю операторы печати после и до вызова следующим образом

print 'Calling myfunction'
call myfunction(arg1,arg2,...);
print 'myfunction finished'

программа отлично работает в режиме выпуска. Если я удаляю один из операторов печати (или оба), я получаю указанную выше ошибку!

Кто-нибудь знает, что здесь может происходить?

Дополнительная информация:

Объявление функции на Фортране:

!DEC$ ALIAS  myfunction, 'myfunction'

Объявление функции в C:

extern "C" void myfunction(double *arg1, double *arg2, ...)

person user3208430    schedule 11.03.2014    source источник
comment
Пожалуйста, исправьте заголовок вопроса   -  person Valamas    schedule 12.03.2014
comment
1) Это функция vararg? 2) Как вы объявили мою функцию в Фортране? 3) Как моя функция была объявлена ​​в C - __stdcall или __cdecl?   -  person cup    schedule 12.03.2014
comment
Извините, а что такое функция vararg?   -  person user3208430    schedule 12.03.2014
comment
Извините, вы меняете его по частям. Просто покажите НАСТОЯЩИЙ код.   -  person Vladimir F    schedule 12.03.2014


Ответы (1)


Это распространенный признак повреждения стека. Возможно, вы вызываете myfunction с неправильными аргументами, но это может быть где-то глубже внутри него. Проверяйте каждый вызов и проверяйте типы всех аргументов.

Обязательно используйте -check all и -warn all с ifort при отладке. Это включает в себя -warn interfaces, который очень полезен в подобных проблемах, но, поскольку вы вызываете функцию C, она, вероятно, не найдет здесь причину.

EDIT — для подпрограммы с двумя аргументами:

В вашем случае убедитесь, что оба аргумента double precision или c_double или real*8 в зависимости от того, какой тип объявления вы используете. Не помещайте туда третий аргумент, как может предложить ваш первый фрагмент кода!

Современный способ взаимодействия с этим в Fortran 2003:

interface
  subroutine myfunction(arg1, arg2) bind(C, name="myfunction")
    use iso_c_binding
    real(c_double) :: arg1, arg2
  end subroutine
end interface

который ставится вместо более старого (и необязательного) external myfunction в части объявления вашего кода.

В любом случае тщательно проверяйте типы и правильное расположение всех аргументов, каким бы ни было их конечное количество.

person Vladimir F    schedule 11.03.2014
comment
Извините за путаницу, ... только для того, чтобы указать, что у меня на самом деле больше аргументов, чем 2 (у него 10 аргументов, смесь целых чисел и вещественных чисел) - person user3208430; 12.03.2014
comment
Я думаю, это действительно научит меня помещать фактический код, как вы говорите, коллега обновил библиотеку C и добавил аргумент в определение функции... что объясняет мою проблему. Спасибо за вашу помощь. - person user3208430; 12.03.2014