【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)三角函数库的主要内容,如果未能解决你的问题,请参考以下文章