ä¸è¬æ¥è®²ï¼ä½çº§è¯è¨æ§è¡ç®æ³çæçé«ï¼èé«çº§è¯è¨ç®åæç¨ï¼å°¤å ¶æ¯å¾å½¢ç¨æ·çé¢(GUI)è¿æ¹é¢å¾å¼ºå¤§ãç°å¨çç§å¦å·¥ç¨è½¯ä»¶çå¼åæµç¨ä¸è¬é½æ¯ç¨ä½çº§è¯è¨åç®æ³ï¼èé«çº§è¯è¨åçé¢ãfortran77å¨ç§å¦è®¡ç®ä¸ä¸ç´ç¬é¢é£éªï¼èc#å å ¶æç¨æ§ä»¥å强大çé¢å对象çç¹ç¹å¤åéçã
ä¸é¢æ¾ç¤ºfortranä¸c#ç交äºçåºæ¬æä½ï¼(ç¼ç¨ç¯å¢ï¼VS2008(C#+IVF))
1.使ç¨fortranç¼ådll
è¿éé¢æ们æ¼ç¤ºæ¯è¾éº»ç¦çä¸ç§æ åµï¼é£å°±æ¯æ°ç»çä¼ éãfortranåCç³»åï¼C/C++/C#ï¼å¨æ°ç»å¤çä¸æ2ç¹ä¸åï¼
(1)fortranæ°ç»ç´¢å¼ä»1å¼å§ï¼èCç³»åæ¯ä»0å¼å§ã
(2)fortranæ°ç»ä»åå¼å§ç´¢å¼ï¼å 为è¿æ¯ç©ç顺åºï¼æ§è¡èµ·æ¥æ´å é«æãå³a(1,2)å®é ä¸æ¯æ°ç»aç第äºè¡ç¬¬ä¸åå ç´ ãæ以å¨fortranä¸ï¼a(m,n)表示månè¡ãådllå¾ç®åï¼åªéè¦å ä¸äºç³æå³å¯ã
subroutine Arr_Sub (var,row,col)
!DEC$ ATTRIBUTES DLLEXPORT :: Arr_SubÂ
!DEC$ ATTRIBUTES ALIAS:'Arr_Sub'::Arr_SubÂ
integer :: row,col
real var(col,row)
integer :: i, j
write(*,*) "Array var received from C# as array is"
write(*,*) varÂ
do i=1,col
do j=1,row
var(i,j)=2.0;
end do
end do
var(1,2)=4.0;
write(*,*) var
end subroutine
å ¶ä¸ï¼!DEC$ ATTRIBUTES DLLEXPORT :: Arr_Sub 表示dllè¾åºå½æ°å称ï¼ä½å 为fortran对大å°åä¸ææï¼æ以è¿æ ·ç³æä¹åéè¦ç¨ARR_SUBæå¯ä»¥è°ç¨ãè!DEC$ ATTRIBUTES ALIAS:âArr_Subâ::Arr_Sub 表示è¾åºå½æ°å¯¹å¤§å°åææã
2.c#è°ç¨fortranç¼åçdll
è¿ä¸ªå ¶å®ä¹å¾ç®åï¼åªéè¦å ä¸ä¸ª[DllImport(...)]åå½æ°çç³æå³å¯ã
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace array
{
class Program
{
//Example of passing array
[DllImport(@"è¿éæ¯dllæ件çè·¯å¾", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void Arr_Sub(float[,] fArr, ref int row, ref int col);
public static void print(float[,] x, int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
{
Console.Write("{0} ", x[i, j]);
}
}
static void Main(string[] args)
{
float[,] fArr = new float[3, 4];
int row = 3;
int col = 4;
fArr[1, 2] = 8;
print(fArr,row,col);
// Call the Fortran subroutine
Arr_Sub(fArr, ref row, ref col);
print(fArr, row, col);
}
}
}
ctrl+F5ï¼çä¸ä¸ç»æå§ã
(1)å æå°åºè°ç¨dllä¹åçæ°ç»ï¼0  0  0  0  0  0  8  0  0  0  0  0
(2)ç¶åæå°åºdllè°çç»æï¼
0.0000000E+00Â Â 0.0000000E+00Â Â 0.0000000E+00Â Â 0.0000000E+00Â Â 0.0000000E+00
0.0000000E+00Â Â 8.000000Â Â Â Â 0.0000000E+00Â Â 0.0000000E+00Â Â 0.0000000E+00
0.0000000E+00Â Â 0.0000000E+00
(3)åæå°dllä¸æ¹ååçæ°ç»ï¼
2.000000Â Â Â Â 2.000000Â Â Â Â 2.000000Â Â Â Â 2.000000Â Â Â Â 4.000000
2.000000Â Â Â Â 2.000000Â Â Â Â 2.000000Â Â Â Â 2.000000Â Â Â Â 2.000000
2.000000Â Â Â Â 2.000000
(4)æåæå°c#è°ç¨dllåçæ°ç»ï¼2  2  2  2  4  2  2  2  2  2  2  2
c#æ°ç»çå¼å°±è¿æ ·è¢«ä¿®æ¹äºã
OK~è¿ä¸ªdemoå好äº(*^__^*)