Мой вопрос похож на здесь , но есть некоторая разница.
У меня есть fortran dll в качестве бэкэнда и C # exe в качестве внешнего интерфейса. Я использую PInvoke для передачи данных между ними.
Между C # и кодом Фортрана 22 параметра. И некоторые из них целочисленные, двойные, указатели (указатели C #), массив и еще много чего. Так что это сочетание типов.
Проблема в том, что для небольших массивов код работает нормально, однако для больших массивов (размер элемента ~ 10k) исключение stackoverflow было вызвано сразу после того, как мой код входит в управляемый код.
Редактировать: мне удалось все уменьшить. Вот код Фортрана:
subroutine chartest(maxncv,ldv)
!DEC$ ATTRIBUTES DLLEXPORT::chartest
!DEC$ ATTRIBUTES ALIAS:'chartest'::chartest
!DEC$ ATTRIBUTES VALUE :: maxncv,ldv
&
integer, intent(in) :: maxncv, ldv
Double precision
& v(ldv,maxncv),d(maxncv,2)
print *, 'hello'
end
А вот мое объявление на C #:
public static extern void chartest(
[MarshalAs(UnmanagedType.I4)] int maxncv,
[MarshalAs(UnmanagedType.I4)] int ldv
);
Если я позвоню chartest(546, 547)
, я получу исключение stackoverflow.
546*547=298662
, это не похоже на большое количество элементов, нет?