在共享库的类中调用 GSL 函数

2023-12-03

我正在尝试用 C++ 创建一个共享库来实现费米气体的工具。我正在使用 GSL 库以数值方式求解函数,并且我的代码在作为脚本运行时运行没有问题,但在尝试将其转换为共享库和类时遇到问题。

我见过类似的问题:Q1 Q2 Q3

我对 C++ 编程相当陌生,似乎无法适应我的问题的不同答案。可能是因为我不太明白答案。

我的代码是:

/* Define structure for the GSL-function: chempot_integrand */
struct chempot_integrand_params { double mu; double T; };

double
ChemicalPotential::chempot_integrand (double x, void * params){
    /* Computes the integrand for the integral used to obtain the chemical potential.
     *
     * This is a GSL-function, which are integrated using gsl_integration_qag.
     */

    // Get input parameters.
    struct chempot_integrand_params * p = (struct chempot_integrand_params *) params;
    double mu = p->mu;
    double T = p->T;

    // Initiate output parameters for GSL-function.
    gsl_sf_result_e10 result;
    int status = gsl_sf_exp_e10_e( ( gsl_pow_2(x) - mu ) / T , &result );

    if (status != GSL_SUCCESS){
        printf ("Fault in calculating exponential function.");
    }

    // Return (double) integrand.
    return (gsl_pow_2(x) / ( 1 + result.val * gsl_sf_pow_int(10,result.e10) ));
}

/* Define structure for the GSL-function: chempot_integration */
struct chempot_integral_params { double T; };

double
ChemicalPotential::chempot_integration (double mu, double T){
    /* Computes the integral used to obtain the chemical potential using the integrand: chempot_integrand.
    */

    // Set input parameters for the integrand: chempot_integrand.
    struct chempot_integrand_params params_integrand = { mu, T };

    // Initiate the numerical integration.
    gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000); // Allocate memory for the numerical integration. Can be made larger if neccessary, REMEMBER to change it in the function call: gsl_integration_qag as well.
    double result, error;
    gsl_function F;
    F.function = &ChemicalPotential::chempot_integrand;
    F.params = &params_integrand;

    // Upper limit for integration
    double TOL = 1e-9;
    double upp_lim = - T * gsl_sf_log(TOL) + 10;

    gsl_integration_qag (&F, 0, upp_lim, 1e-12, 1e-12, 1000, 6, w, &result, &error);

    // Free memory used for the integration.
    gsl_integration_workspace_free (w);

    return result;
}

编译时出现错误

error: cannot convert ‘double (Fermi_Gas::ChemicalPotential::*)(double, void*)’ to ‘double (*)(double, void*)’ 

in line

F.function = &ChemicalPotential::chempot_integrand;

人们一遍又一遍地问这个问题确实很有趣。原因之一可能是所提出的解决方案不容易理解。我就是其中之一,在理解和实施它们时遇到了问题。 (正如您所期望的那样,这些解决方案对我来说并不是开箱即用的。)

在...的帮助下tlamadon我刚刚想出了一个解决方案,在这里也可能有帮助。让我们看看你们的想法。

回顾一下,问题在于您有一个类,其中包含一个成员函数,您希望在该类上使用 GSL 库中的某些内容进行操作。如果 GSL 接口需要

gsl_function F;

请参阅此处的定义。

这是示例类:

class MyClass {

    private:
        gsl_f_pars *p;  // not necessary to have as member

    public: 
        double obj(double x, void * pars);  // objective fun
        double GetSolution( void );  
        void setPars( gsl_f_pars * xp ) { p = xp; };
        double getC( void )  ;  // helper fun

};

这项练习的目标是能够

  1. 发起MyClass test,
  2. 为其提供参数结构(或编写相应的构造函数),并且
  3. call test.GetSolution()其上,它应该返回 GSL 函数的用途(最小值)obj、根、积分或其​​他)

现在的技巧是在参数中放置一个元素struct gsl_f_pars which 是一个指向 MyClass 的指针。这是结构:

struct gsl_f_pars {
    double a;
    double b;
    double c;
    MyClass * pt_MyClass;
};

最后一部分是提供一个将在内部调用的包装器MyClass::GetSolution()(包装器是成员函数的替代品MyClass::obj,我们不能仅仅用&obj类内)。该包装器将采用参数结构体,取消引用pt_MyClass并评估pt_MyClass的会员obj:

// Wrapper that points to member function
// Trick: MyClass is an element of the gsl_f_pars struct
// so we can tease the value of the objective function out
// of there.
double gslClassWrapper(double x, void * pp) {
    gsl_f_pars *p = (gsl_f_pars *)pp;
    return p->pt_MyClass->obj(x,p);
}

完整的示例有点太长,无法在这里发布,所以我提出了一个要点。它是头文件 and a cpp file,只要有 GSL,它就应该可以工作。编译并运行

g++ MyClass.cpp -lgsl -o test
./test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在共享库的类中调用 GSL 函数 的相关文章

  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 使用corona sdk的后台无限

    我正在尝试滚动 Corona sdk 中的背景 无限背景 我重复使用了两张图像 854x176 我尝试了这个功能 function mov self event if self x lt 854 then self x 854 else s
  • 是否可以从本机代码访问 Dalvik VM

    我希望能够使用 Android 中的本机代码来定位 Dalvik VM 这意味着使用中列出的本机类平台 dalvik在 android 源存储库下 我特别想打电话Sync dvmLockObject及其对应物Sync dvmUnlockOb
  • 没有数组的埃拉托斯特尼筛法?

    我必须为 埃拉托斯特尼筛 算法编写一个java代码 以便在控制台上打印出达到给定最大值的素数 但我不允许使用数组 我们的教授告诉我们 只有借助循环才能做到这一点 所以我想了很多 也用谷歌搜索了很多关于这个话题的信息 但找不到答案 我认为这根
  • 无法在 Javafx 应用程序中为 javascript 创建 javax 脚本引擎

    我正在使用 NetBeans 12 0 和 windows 10 64 位 我的 JDK 是 15 0 2 和 JavaFx SDK 16 当我尝试构建我的 javafx 应用程序时 它显示以下构建错误 C Users musta OneD
  • 来自 survfit 对象和 textConnection 的中值

    我使用了其他人的方法来获取中位数survfit对象 即使用textConnecton 但我遇到了几个问题 example library survival data cancer cox ph lt coxph Surv time stat
  • php循环遍历json数组

    我有一个像这样的 json 字符串 fields string fields customers name john id d1 name mike id d2 name andrew id d3 name peter id d4 如何打印
  • PHP 5.3 中的闭包内的 $this 是否有解决方法?

    我的 IDE 警告我 thisPHP 5 4 之前的闭包中不允许使用 是否有解决方法 无需从 5 3 10 升级 PHP 看fire 方法如下
  • 在 UIPageViewController 中禁用页面滚动[重复]

    这个问题在这里已经有答案了 我正在开发使用 UIPageViewController 的应用程序 现在我想禁用页面滚动而不是手势 实际上我想在 UIPageViewController 中包含的视图中绘制签名 为此我需要禁用页面滚动 我已经
  • 如何使用 WEB-INF/lib 中的服务器 jar 覆盖服务器 jar 或使用它们?

    我有一个Web应用程序应该使用WEB INF lib中包含的JSF 2 0库 但它没有 而不是我收到异常 因为我的服务器 JBoss 4 2 也提供了JSF库 我如何强制我的应用程序使用 WEB INF lib 中的 jar Note 当我
  • 在R中使用“unlink”后如何取回文件?

    我不小心删除了一些有用的文件 文件已被删除 我在回收站中找不到它们 我想知道怎样才能拿回来 我使用的是 Windows 8 1 我的文档中的所有文件都在R中使用unlink删除了 我尝试使用R delete来恢复 但它只能恢复从回收站删除的
  • 系统/应用程序中的 APK 何时安装?

    我创建了一个自定义系统映像 并将一个额外的 APK 放入系统 应用程序中 这有点有效 我可以运行该应用程序 但是本机库未加载 loadLibrary 失败 当我打电话时pm install在 APK 上 一切正常并且本地库加载 我的结论是
  • 返回回调(从 CustomView 中打开 DialogFragment)

    这与我之前的问题有关 从 CustomView 中打开 DialogFragment 我现在需要使用回调从 DialogFragment 返回一个值 据我了解 通常会这样做 public class MyDialogFragment ext
  • 如何在乌龟中创建按钮?

    如何在turtle python中创建一个简单的按钮 如果单击它 您可以定义它来打印消息 或者做其他更复杂的事情 You can embed正如 JoshuaNixon 在他的评论中建议的那样 tkinter 中的海龟使用 tkinter
  • 微风过滤。在服务器端扩展

    我正在尝试BreezeJS 有一个要求我可以使用 expand在客户端代码中 但基于role对于该用户 服务器端不会返回该用户的所有记录 expand请求的类型 我尝试创建一个自定义BreezeQueryable属性并重写一个方法来完全过滤
  • PHP:如何发送HTTP响应代码?

    我有一个 PHP 脚本 需要使用 HTTP 响应代码 状态代码 进行响应 例如 HTTP 200 OK 或某些 4XX 或 5XX 代码 我怎样才能在 PHP 中做到这一点 我刚刚发现这个问题并认为它需要更全面的答案 As of PHP 5
  • 自动解决主键合并冲突

    你能建议我自动解决的方法吗 发布者和订阅者之间合并期间的主键冲突 看来 Sql Server 并没有开箱即用 冲突查看器向我显示下一条消息 在 publisher server 处插入的行无法传播到 subscriber server 此失
  • 使用 Hibernate 通过 SSH 隧道获取数据

    最近开始学习Hibernate技术 要使用Hibernate从数据库中获取数据 问题是我只能通过 SSH 隧道连接到数据库 有没有我可以使用的属性hibernate cfg xml文件来解决这个问题 或者您可以提出另一种新手可以理解的方法
  • 如何在Python中迭代列表时从列表中删除元素? [复制]

    这个问题在这里已经有答案了 给定一个数字列表 L 1 2 3 4 5 当我迭代它时 如何从列表中删除一个元素 假设是 3 我尝试了以下代码 但没有成功 for el in L if el 3 del el 最好的做法通常是建设性地进行 建立
  • 处理超过 200 个复选框,将它们存储在状态中

    我有一个表 父元素 它获取用户并将每一行呈现为它自己的组件 表中的行包含复选框 目标是能够使用复选框并检索选中的复选框 问题是 当我将函数传递给每一行 子组件 时 触发将选中的复选框值添加到数组 由选定用户的 id 组成 中 整个组件会重新
  • 在共享库的类中调用 GSL 函数

    我正在尝试用 C 创建一个共享库来实现费米气体的工具 我正在使用 GSL 库以数值方式求解函数 并且我的代码在作为脚本运行时运行没有问题 但在尝试将其转换为共享库和类时遇到问题 我见过类似的问题 Q1 Q2 Q3 我对 C 编程相当陌生 似