可以在Fortran中使用C#样式接口,还是针对常见Fortran库的任何其他想法?

时间:2014-08-27 03:11:59

标签: c# interface fortran

我正在寻找有关如何构建一些FORTRAN库的一些建议。我有各种各样的程序,它们具有相似但不同的数据结构,并希望在公共库中使用这些结构,以避免重复代码。

选项:

  1. 通过强制包含任何应用程序所需的所有字段的公共定义,强制数据结构相同。感觉就像一个糟糕的决定,因为数据结构的使用因程序而异。

  2. 使用继承并为每个定义的类型设置一个共同的祖先,以便只包含公共库所需的字段。不错,但强制共同的单继承树。

  3. 使用C#意义上的接口,其中保证已建立的相关字段组但不需要祖先。听起来不错,但不确定FORTRAN是否可行。

  4. 找一个将FORTRAN转换为C#的魔术转换器程序。我过去的测试发现,这可能"是可能的,但生成的代码会被修复并且难以维护。

  5. 手动转换为其他语言。这很诱人,但代码库太大,手动迁移需要数年时间。

  6. 其他的东西。

  7. 非常感谢任何建议或指导。

    谢谢,

1 个答案:

答案 0 :(得分:1)

如果不希望从抽象类型(#2)进行公共继承,那么典型的方法是编写类型,使它们具有必要的接口一致性,然后将公共代码放在一个单独的文件中是使用INCLUDE文件引入的。可以使用USE重命名和隐式类型之类的东西来实现类型参数化。

这是你的#3的近似值。

"使用重命名"指的是将USE语句中的实体重命名为与USE< d; dd模块中的实体名称不同的能力。这允许你做...

USE some_module, ONLY: name_wanted_by_included_source => original_name
INCLUDE 'some_source'

然后包含的源与name_wanted_by_included_source一起使用,无论原始代码中的实体名称是什么。

隐式输入可以用来做类似的事情,通常与隐式输入有关:

IMPLICIT TYPE(my_type_name)(Q)
INCLUDE 'some_other_source'

some_other_source中以字母Q开头(未另行声明)的任何实体都属于my_type_name类型。

有些人使用Fortran外部的工具(例如C预处理器或PyF95 ++)来进行类似的代码模板化。