2013-04-08 3 views
2

Я не нашел сообщений о переполнении стека, которые обсуждают вызов C# из Fortran (я также использую Visual Studio 2010 с установленной Intel Visual Fortran). Тем не менее, существует (очень) ограниченное количество сообщений [1, 2, 3], которые обсуждают вызов C/C++ из fortran.вызов C# из Fortran

В одном из ответов на эти сообщения было высказано предположение, что вызов C++ из Fortran сложнее вызова C, что вызвало мои подозрения, что C# может быть еще сложнее? Не имея фундамента в C/C++/C#, мне интересно, применимы ли к C# процедуры, изложенные для C/C++?

Одна общая черта, которую я заметил среди этих сообщений, заключалась в том, что необходим встроенный модуль под названием ISO_C_BINDING. Прочитав немного больше об этом here, мне не было ясно, что ISO_C_BINDING позволит мне передать пару 2D-массивов ценность информации в программу (скомпилированную как DLL), написанную на C#, вызвать некоторые «события», (аналогично функциям?) и, наконец, вернуть 2D-массив информации из C#, прежде чем перейти к моему бизнесу в Fortran.

Если вы знакомы с Fortran и C#, не могли бы вы рассказать мне, соответствует ли ISO_C_BINDING задаче? Я не получил этого смысла от информации, указанной выше. Если у кого есть рабочий пример, который включает в себя проходящие массивы между C# и Fortran, а также вызова C# функции из Fortran, я бы очень признателен за возможность посмотреть его на как шаблон для того, как я мог бы продолжить. Спасибо, Эрик

+0

Вы можете обернуть Fortran код C клеем. Тогда ваш код 'C# 'вызовет код * C *, который вызовет ваш * Fortran * –

+0

Привет, пользователь2256085, я задаю этот один и тот же вопрос, и, как и вы, у меня проблемы с поиском большого количества контента. Когда я что-то нахожу, как и ответ ниже, он часто кажется неправильным, это Fortran для C#, а не Vice Versa. Вы узнали что-нибудь новое за 2 года с тех пор, как вы разместили это? – u8it

+0

P57, в конце концов, я смог получить пример работы. Если есть возможность продолжить этот разговор напрямую (по электронной почте), давайте сделаем это, хотя для этого может потребоваться, чтобы один из нас разместил здесь прямую контактную информацию, которую вы, возможно, не захотите делать (я этого не делаю). – user2256085

ответ

2

Fortran код:

function TestPass (floatArray) result (iRes) 
implicit none 
dll_export :: TestPass ! export function name 

integer :: Ires 
real, intent (in out) :: floatArray 

dimension floatArray(5) 

iRes = 0 ! Assign function result 

open (5,FILE='output.txt') 
write (5, 100) floatArray(3) 

floatArray(0) = 0.0 
floatArray(1) = 1.1 
floatArray(2) = 2.2 
floatArray(3) = 3.3 
floatArray(4) = 4.4 

! correct values are written to file here... 
open (5,FILE='output.txt') 
write (5, 100) floatArray(3) 
100 format(5X,'got here',5X,F3.3) 
close (5) 
end function 

C# код:

static extern int TestPass (
[MarshalAs(UnmanagedType.LPArray, SizeConst=5, 
ArraySubType=UnmanagedType.R4)] 
float [] yields); 

private void BtnTestClick(object sender, System.EventArgs e) 
{ 
float [] floatArray = new float[5] {9.9F, 9.9F, 9.9F, 9.9F, 9.9F}; 
TestPass(floatArray); 

// floatArray.Length == 0 after the function call 

for (int i = 0; i < floatArray.Length; i++) 
Trace.WriteLine(floatArray[i]); 
} 

см Также по этой ссылке:

http://software.intel.com/en-us/articles/calling-fortran-function-or-subroutine-in-dll-from-c-code

Вы также можете обратиться некоторые теории об этом:

http://www.ibiblio.org/pub/languages/fortran/ch2-4.html

+0

Привет, Freelancer, Господи, мне нужно было вернуться и перечитать мой оригинальный пост, потому что пример, который вы предоставили, заставил меня подумать, что я попросил совершенно противоположное тому, что я намеревался. Если я не пропустил очевидное, что вполне возможно, я выпрашивал пример, в котором C# был вызван из Fortran. То есть, есть ли у вас (или кто-то еще в этом отношении) пример кода fortran, который использует функцию, написанную на C#, а не наоборот, как показано выше? – user2256085

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