主题:[原创]C#同FORTRAN混合编程的字符串传递方法
[u][b]C#与FORTRAN混合编程中的字符串传递方法[/b][/u]
[b]Introduction:[/b]
前段时间编程的时候遇到的问题,也曾经发过帖子但是没有能够得到解决.后来有网友通过邮件联系希望能够找到解决字符串传递的方法,并且提供了相关的资料.笔者自己也通过一些文献的查找,最后调试出了一种能够进行传递的方法.
[b]Method Principle:[/b]
今晚看了几篇文献发现了有一种方法可以将字符串传递过去
而且我也编程试过,可以运行
原理很简单,就是避免直接的进行不同类型的字符串传递
换用数组传递,具体操作流程如下:
C#中的字符串传向FORTRAN
step1: 在C#中将字符串分割为字符数组
step2: 再将字符数组转为ASCII码数组,然后传递给FORTRAN
step3: 在FORTRAN中利用CHAR()函数将ASCII码还原为字符串即可
NOTE: FORTRAN传向C#也是可以采用相同的思路进行
[b]Applied Example[/b]
Example Codes:
---------------------------------------------------------------------
//C#中的字符串分割,并转存为ASCII码数组
string c = "abcdefg";
ASCIIEncoding ascii = new ASCIIEncoding();
int[] num = new int[c.Length];
for (int i = 0; i < c.Length; i++)
{
num[i] = (int)ascii.GetBytes(c)[i];
}
int m = c.Length;
[color=FF0000]S(ref num[0],ref m);[/color]
---------------------------------------------------------------------
//C#调用DLL声明及操作
[DllImport("DLL TEST.dll", SetLastError = true, CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.StdCall)]
public static extern void S(ref int ka, ref int m);
//参数说明: ka为ASCII码数组名; m为ka数组大小(即字符串长度)
----------------------------------------------------------------------
!FORTRAN中还原操作
subroutine s(ka,m)
!dec$ attributes dllexport ::s
character(m)::str
dimension ka(m)
integer i
integer x,y
do i=1,m
str(i:i)=char(ka(i))
enddo
end
-----------------------------------------------------------------------
[b]Conclution and Discussion[/b]
字符串的传递是混合编程中需要考虑得最多的问题,因此如何进行有效的数据传递是关键点.我们提出的方法能够成功的进行字符串传递.结合实际编程的需要,可以进行例如文件名,文件路径的传递,利用FORTRAN方便的文件读写功能等应用.
关于字符串的传递还可以有其它的解决办法,例如针对FORTRAN中的ASC类型和C#中Unicode类型以及各自的特点可以进行转换;
混合编程的优势是很明显的,解决好基本的传递问题以后,可以更大限度的发挥面向对象和面向过程的结合;底层科学计算语言与高层界面开发的结合的完美展现!
[b]Acknowledgements[/b]
感谢网友:
***********************************
Zhoutao, M.En.
School of Civil Engneering CSU
No.22 Shaoshan SouthRoad
Changsha, P.R.China
Zip Code: 410075
Tel: 86-731-2655003
CellPhone: 13975809495
***********************************
[b]Technique Support[/b]
欢迎交流讨论
Email: mou_yq@126.com
[b]Introduction:[/b]
前段时间编程的时候遇到的问题,也曾经发过帖子但是没有能够得到解决.后来有网友通过邮件联系希望能够找到解决字符串传递的方法,并且提供了相关的资料.笔者自己也通过一些文献的查找,最后调试出了一种能够进行传递的方法.
[b]Method Principle:[/b]
今晚看了几篇文献发现了有一种方法可以将字符串传递过去
而且我也编程试过,可以运行
原理很简单,就是避免直接的进行不同类型的字符串传递
换用数组传递,具体操作流程如下:
C#中的字符串传向FORTRAN
step1: 在C#中将字符串分割为字符数组
step2: 再将字符数组转为ASCII码数组,然后传递给FORTRAN
step3: 在FORTRAN中利用CHAR()函数将ASCII码还原为字符串即可
NOTE: FORTRAN传向C#也是可以采用相同的思路进行
[b]Applied Example[/b]
Example Codes:
---------------------------------------------------------------------
//C#中的字符串分割,并转存为ASCII码数组
string c = "abcdefg";
ASCIIEncoding ascii = new ASCIIEncoding();
int[] num = new int[c.Length];
for (int i = 0; i < c.Length; i++)
{
num[i] = (int)ascii.GetBytes(c)[i];
}
int m = c.Length;
[color=FF0000]S(ref num[0],ref m);[/color]
---------------------------------------------------------------------
//C#调用DLL声明及操作
[DllImport("DLL TEST.dll", SetLastError = true, CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.StdCall)]
public static extern void S(ref int ka, ref int m);
//参数说明: ka为ASCII码数组名; m为ka数组大小(即字符串长度)
----------------------------------------------------------------------
!FORTRAN中还原操作
subroutine s(ka,m)
!dec$ attributes dllexport ::s
character(m)::str
dimension ka(m)
integer i
integer x,y
do i=1,m
str(i:i)=char(ka(i))
enddo
end
-----------------------------------------------------------------------
[b]Conclution and Discussion[/b]
字符串的传递是混合编程中需要考虑得最多的问题,因此如何进行有效的数据传递是关键点.我们提出的方法能够成功的进行字符串传递.结合实际编程的需要,可以进行例如文件名,文件路径的传递,利用FORTRAN方便的文件读写功能等应用.
关于字符串的传递还可以有其它的解决办法,例如针对FORTRAN中的ASC类型和C#中Unicode类型以及各自的特点可以进行转换;
混合编程的优势是很明显的,解决好基本的传递问题以后,可以更大限度的发挥面向对象和面向过程的结合;底层科学计算语言与高层界面开发的结合的完美展现!
[b]Acknowledgements[/b]
感谢网友:
***********************************
Zhoutao, M.En.
School of Civil Engneering CSU
No.22 Shaoshan SouthRoad
Changsha, P.R.China
Zip Code: 410075
Tel: 86-731-2655003
CellPhone: 13975809495
***********************************
[b]Technique Support[/b]
欢迎交流讨论
Email: mou_yq@126.com