2

我正在用 C++ 编写一个静态库,期望它被 Fortran 或 C 使用。由于 Fortran 的所有索引都从 1 开始,所以当 Fortran 调用时,我必须在我的库中进行一些索引修改。因为我将一组索引传递给库,这对于进一步计算很重要。

当然,解决这个问题的一种直观方法是在界面上设置一个参数,让用户告诉我他们正在使用什么语言,但我认为这不是一个很酷的方法。

所以我想知道如果它是由 Fortran 或 C 调用的,是否有任何方法可以在我的库中检测?

谢谢!

4

3 回答 3

1

如果您只是传递数组及其长度,则应该没有任何问题。问题是只有当你传递一个索引时,你才需要知道那个索引是相对于什么的。(在 Fortran 中可以是任何值,如果数组被显式声明为以非 1 的索引开始)。如果你有这种情况,我的建议是为其中一种语言编写粘合例程来转换索引值,然后调用常规库例程。这个解决方案的问题在于它要求“特殊”语言的用户调用特殊的粘合例程。调用常规例程是一个错误。

于 2013-04-11T21:23:45.933 回答
0

任何语言的应用程序和库都将针对相同的 ABI 构建。ABI 定义了调用约定和其他细节,使由不同编译器(可能针对不同语言)构建的两个函数可以相互调用。通话中不应该有任何明显的不同,因为已经付出了巨大的努力来避免这些差异。

您可以查找带外信息,例如 FORTRAN 编译器提供的符号(或从其实用程序库中提取)。您将使用该属性声明一些符号,weak如果它变得有效,您将知道当前可执行映像中的某处有一些FORTRAN 。但是,您不知道它是直接调用您还是仅仅因为引入了其他库。

正确的解决方案似乎是使用显式包装器从 FORTRAN 调用 C: Calling a FORTRAN subroutine from C

于 2013-04-11T21:16:44.560 回答
0

如果你设置一个开始索引会更好。Fortran 数组不一定要从 1 开始。它们可以从任意数字开始。该数组可能已声明为

float, dimension(-20:20):: neg
float, dimension(4:99) pos

因此,为 neg 传递 5 的索引意味着第 26 个元素,为 pos 传递 5 的索引意味着第 2 个元素。

于 2013-04-12T22:53:59.227 回答