【Fortran调试问题】(2)三角函数库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【Fortran调试问题】(2)三角函数库相关的知识,希望对你有一定的参考价值。

参考技术A

查了Fortran相关的数学函数库如下图:

在Fortran95的库函数——三角函数库里面,没有 Sec(Secant 正割= sec(x)=1/cos(x)) 之类的三角函数。

所以,Fortran的sec(x)=1/cos(x)表达式,需要经过如下的转换:

将 unique_ptr 传递给库函数(FORTRAN 函数)

【中文标题】将 unique_ptr 传递给库函数(FORTRAN 函数)【英文标题】:Passing unique_ptr to library functions (FORTRAN function) 【发布时间】:2014-11-09 06:38:46 【问题描述】:

我正在使用 LAPACK 库来创建一个使用 C++ 的 R 包。我正在使用 unique_ptr 将数组定义为

   unique_ptr<double[]> my_arr(new double[arr_length]);

然后我将这个 unique_ptr 传递给库函数(FORTRAN 函数),该函数接受指向双精度数组的指针,并将函数内部的这个数组更新为

   F77_CALL(daxpy) (&num_feat_, &beta, tmp, &inc_one, my_arr.get(), &inc_one);

浏览网页后,我注意到不建议将 unique_ptr 作为指针参数传递给函数。但是,我正在使用的库函数在其参数中需要一个指针。由于库函数需要更新指针,因此在将指针发送到函数之前我无法释放指针。 有没有有效的方法来处理这个问题?

【问题讨论】:

显然,这样做有点不舒服,因为您明确回避了使 unique_ptr 安全的所有机制;但在一个类似的问题here 中,共识似乎是,当处理一个期望原始指针(Fortran、C 或其他)的 API 时,使用 .get() 是可以的,而例程不会执行使用指针进行任何内存管理(BLAS 肯定不会)。请注意,DAXPY 不会更新 指针;它会更新指向的数据。 @JonathanDursi 我不认为这是一件不舒服的事情。我认为这是一件非常自然的事情。调用代码拥有数组的唯一所有权,您知道在调用库期间它将保持活动状态。我认为这是调用函数的正确方法,即使它们在您自己的代码中。这是假设函数没有尝试获取数组的所有权并稍后对其调用 delete 在这种情况下使用 unique_ptr 是一个坏主意。 【参考方案1】:

假设库不会获得数组的所有权并尝试 delete 它本身,我认为这很好。

您通常应该更喜欢通过引用或原始指针传递,并且通常只在转移所有权时传递unique_ptr,所以我认为这是正确的。调用代码保留数组的唯一所有权。

您知道,直到 unique_ptr 超出您想要的范围时,该数组才会被删除。

我认为这是调用不会获得所有权的函数的正确方法,即使它们在您自己的代码中。

有关如何传递(智能)指针的摘要,请参阅 GotW #91。

如果库在函数调用之后保留了指针,您必须确保 unique_ptr 在库完成使用它之前没有超出范围,这有点棘手。

有些库假设您将在堆上分配对象并通过原始指针赋予它们所有权(我在一些可视化库中看到过)。他们完成后delete 对象。这在 C++11 中通常被认为是不好的做法,但如果您需要调用此类库,则不应使用 unique_ptr,因为您不想自己 delete 对象。

【讨论】:

为什么不将unique_ptr 作为参数传递?对我来说,它就像 Fortran 的 allocatable 并且传递它没有问题。当函数返回时,您将获得变量的当前状态。 @VladimirF 在某些情况下,您想传递unique_ptr,最常见的是我提到的转让所有权。 GotW #91 给出了很好的总结。但在大多数情况下(例如这种情况),您不会转移所有权,而应该使用原始指针或引用。除非您重新定位指针(这可能是您所指的),否则没有理由通过引用传递 unique_ptr。就个人而言,我很少发现我需要重新安装 unique_ptr 并且通常可以按值返回。

以上是关于【Fortran调试问题】(2)三角函数库的主要内容,如果未能解决你的问题,请参考以下文章

C语言调用Fortran

fortran的函数变量问题

如何编译C/Fortran动态/静态链接库

使用Fortran共享库时名称不匹配

fortran关于数组内部函数的问题

Python调用Fortran的三种形式