请选择 进入手机版 | 继续访问电脑版

因斯福论坛

搜索
查看: 6801|回复: 1

C++ 向 Fortran 传递字符串的简易解决方案

[复制链接]
发表于 2014-3-16 21:26:23 | 显示全部楼层 |阅读模式
向 Fortran 传递字符串的简易解决方案



摘要:C++ 字符串传递给 Fortran 时,需要将字符串内容和长度同时传送,Windows 下默认的方式是长度紧跟字符串。通过学习 CHEMKIN 部分 C++ 语言调用 Fortran 过程的源代码,可以看出其解决方案很简易。其实质是创建 CHARACTER 类,包含了字符串内容和长度成员。字符串传递前,将函数原型中的字符串声明为 CHARACTER 类型实现隐式转换。

源代码见附件: ForString_20140316.rar (13.26 KB, 下载次数: 3590)
回复

使用道具 举报

 楼主| 发表于 2014-3-20 16:44:25 | 显示全部楼层
C# 传递字符串到 Fortran

如果是 C# 向 Fortran 传递字符串,需要定义结构 struct。

(1) Fortran 函数

文件:CKPreprocess.for

  Integer Function CKPreprocess(strFileMechanism, strFileThermoData, strFileOut, strFileLink)
      !DEC$ Attributes DllExport, Decorate, Alias:'CKPreprocess'::CKPreprocess
      ! To do
  End Function

(2) C# 函数声明 Fortran 函数

文件: CKLib.cs

    public class CKLib
    {
        /// <summary>
        /// 模拟 Fortran 字符串
        /// </summary>
        public struct CHARACTER
        {
            string str;
            int len;
            
            public CHARACTER(string str)
            {
                this.str = str;
                this.len = str.Length;
            }

        }

        /// <summary>
        /// CHEMKIN 前处理,调用方法 1,指明 字符串长度
        /// </summary>
        [DllImport("CKPreprocess.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int CKPreprocess(String strFileMechanism, int lenStrFileMechanism,
            String strFileThermalData, int lenStrFileThermalData,
            String strFileOut, int lenStrFileOut,
            String strFileCKLink, int lenStrFileCKLink);

        /// <summary>
        /// CHEMKIN 前处理,调用方法 2,通过 CHARACTER 结构传递参数
        /// </summary>
        [DllImport("CKPreprocess.dll", CallingConvention = CallingConvention.StdCall)]
        public static extern int CKPreprocess(CHARACTER strFileMechanism, CHARACTER strFileThermalData,
            CHARACTER strFileOut, CHARACTER strFileCKLink);
    }

(3) C# 调用 Fortran 函数


     // 方法 1,指明 字符串长度
     CKLib.CKPreprocess(strMechanismFile, strMechanismFile.Length,  strThermalDataFile, strThermalDataFile.Length,
              strOutputFile, strOutputFile.Length, strCKLinkFile, strCKLinkFile.Length);

     // 方法 2,通过 CHARACTER 结构传递参数
     CKLib.CKPreprocess(new CKLib.CHARACTER(strMechanismFile), new CKLib.CHARACTER(strThermalDataFile),
              new CKLib.CHARACTER(strOutputFile), new CKLib.CHARACTER(strCKLinkFile));

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|因斯福论坛  

GMT+8, 2020-10-26 08:43

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表