外部函数:从 C 脚本使用 .dll 的替代方法

2023-12-06

这是一个伴随问题外部函数:在 C 脚本中引用头文件来编译 dll.

该堆栈溢出问题是使用 Modelica 外部函数调用 c 脚本。然后,该 c 脚本使用 .dll 中包含的 c 函数。以下是我尝试过的最初首选方法和我不喜欢的工作尝试。


初步尝试:

以下代码将不起作用。我的假设是因为我加载了 .dll 库libgsl在 Modelica 中,我可以简单地使用 C 脚本中的标头来使用来自该 .dll 的函数调用。但是,dslog.txt文件表明无法识别gsl_sf_bessel_j0。显然,C 脚本不知道任何关于libgsl.dll我在 Modelica 中指定的。

模型功能:

function chirp

  input Modelica.SIunits.AngularVelocity w_start;
  input Modelica.SIunits.AngularVelocity w_end;
  input Real A;
  input Real M;
  input Real t;
  output Real u "output signal";

  external "C" u=chirp(w_start,w_end,A,M,t)
    annotation(Library="libgsl", Include="#include \"chirp.c\"");
end chirp;

C 脚本:

#include <gsl/gsl_sf_bessel.h>

double chirp2(double w1, double w2, double A, double M, double time)
{
  double res;
  double y;
  res=A*cos(w1*time+(w2-w1)*time*time/(2*M));
  y = gsl_sf_bessel_j0(res);
  return y;
}

工作尝试:

为了使用 C 脚本在外部函数调用中使用 .dll,我发现有必要使用LoadLibrary命令。

这个方法真的有必要吗?这比我最初的尝试要复杂得多,我希望 Modelica 包含加载 .dll 所需的“诀窍”。

Bonus:似乎有一种方法可以将错误消息发送回 Modelica。void ModelicaVFormatError(const char* string, va_​​list)。了解其用法的参考示例,以便我可以替换似乎不会将任何内容发送回 Modelica 的 printf 语句?

模型功能:

function chirp

  input Modelica.SIunits.AngularVelocity w_start;
  input Modelica.SIunits.AngularVelocity w_end;
  input Real A;
  input Real M;
  input Real t;
  input String fileName= Modelica.Utilities.Files.loadResource("modelica://ExternalFuncTest/Resources/Library/libgsl.dll") "Full file name for GSL library";

  output Real u "output signal";

  external "C" u=chirp(w_start,w_end,A,M,t)
    annotation(Include="#include \"chirp.c\""); // <-- Removed Library reference
end chirp;

C 脚本:

#include <windows.h>
#include <stdio.h>

typedef double (__cdecl *BESSEL)(const double); 
double chirp3(double w1, double w2, double A, double M, double time, const char* fileName)
{
    HINSTANCE hinstLib; 
    BESSEL bessel_J0; 
    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(fileName); 

     // If the handle is valid, try to get the function address.

    double res;
    double y = 0;

    res=A*cos(w1*time+(w2-w1)*time*time/(2*M));

    if (hinstLib != NULL) 
    { 
        bessel_J0 = (BESSEL) GetProcAddress(hinstLib, "gsl_sf_bessel_j0"); 

        // If the function address is valid, call the function.

        if (NULL != bessel_J0) 
        {
            fRunTimeLinkSuccess = TRUE;
            printf("Success loading library method.\n"); //<-- Alternative to send message back to Modelica log file?
            y = bessel_J0(res);
        } else
        {
            printf("Failed to load library\n"); //<-- Alternative to send message back to Modelica log file?
        }
        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib); 
    } 

    return y;
}

None

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

外部函数:从 C 脚本使用 .dll 的替代方法 的相关文章

  • 如何在 Openmodelica 中指定介质?

    我正在 Modelica 中模拟热泵热水系统 我附上了我的模特的照片 但是 当我运行模型时 出现错误 Medium 是部分的 部分类中不允许进行名称查找 您能告诉我吗 我该如何指定水箱 热泵冷凝器和管道中的水 我应该如何指定热泵蒸发器中的空
  • 两相 Modelica Media 示例

    我正在尝试在 OpenModelica 中开发具有单一物质 液体或蒸汽 的流动模拟 Modelica Media Water 模型确实有两个阶段 但极其复杂 并且很难用完全不同的物质来重现 我想找到一个我可以使用的两相介质的简单示例 有一个
  • modelica 中的功能集成

    我想在 Modelica 中对时间以外的变量函数进行积分 但我不知道该怎么做 例如 如何计算上限为 5 下限为 2 的 x dx 的积分 x dx x 2 2 Modelica 并不是像 Maple Mathematica 或 Matlab
  • 来自 Dymola mos 脚本的 mkdir

    我有一个用于运行多个模拟的 mos 脚本 在运行模拟之前 我想cd to a new目录 以便保存所有结果和日志文件并且永远不会被覆盖 目前只能cd据我所知 到现有目录 任何人都建议如何创建名为例如的目录temp modelname and
  • 非线性代数方程的初步猜测

    我有一个非线性代数方程组需要求解 如何使用计算值 具有连续时间变化 作为解变量的初始猜测 而不是使用参数作为起始值 初始方程部分可以用于此目的吗 我创建了一个测试模型来解释这个问题 model Teststartvalue Real val
  • 外部函数:从 C 脚本使用 .dll 的替代方法

    这是一个伴随问题外部函数 在 C 脚本中引用头文件来编译 dll 该堆栈溢出问题是使用 Modelica 外部函数调用 c 脚本 然后 该 c 脚本使用 dll 中包含的 c 函数 以下是我尝试过的最初首选方法和我不喜欢的工作尝试 初步尝试
  • Modelica 仿真和方程初始化总时间计算

    我想测量 DAE 系统的总模拟和初始化时间 我对挂钟时间感兴趣 就像 Matlab 中函数 tic toc 给出的时间 我注意到在 Modelica 中 模拟时间有不同的标志 但实际上 与我按下模拟按钮到模拟结束所经过的时间 大约用手机时钟
  • 使用 python 进行 Modelica 参数研究

    我想使用 python 在不同的 modelica 建筑库 建筑物 IDEAS 中运行参数研究 例如 更改渗透率 我尝试过 simulateModel和simulateExtendedModel zone n50 value 我的问题 为什
  • 在 OpenModelica 中模拟闭式液压循环

    我想对一个封闭的液压循环进行建模 正如人们可以在 Modelica 标准库 流体 示例 加热系统中找到的那样 对于供暖系统以及我的 简约 示例 我遇到了同样的问题 系统是超定的 在接下来的讲座中 您可以发现加热系统是一个 坏例子 所以我想这
  • 外部函数:在 C 脚本中引用头文件来编译 dll

    使用 Dymola 2017 情况 A 调用外部 c 脚本 我已经成功实现了没有 include 语句的简单外部 c 函数 模型功能 function chirp input Modelica SIunits AngularVelocity
  • 如何在 modelica 中进行局部敏感性分析

    我想在 Dymola 中进行局部敏感性分析 以评估影响建筑物 多户住宅 能耗的不同参数 谁能给我一些建议 如何在 Dymola Modelica 软件中做到这一点 您可以将模型导出为 FMU 然后按照多种不同路径之一使用 FMU 进行敏感性
  • 是否可以在 Windows 机器上从 Dymola 编译 Linux 可运行的 fmus?

    我正在尝试使用 Dymola 从 Windows 计算机导出 FMU 以便在 Linux 和 Windows 操作系统上使用 我猜这样的 fmu 将有 linux64 和 linux32 二进制文件以及 win32 和 win64 二进制文
  • 如何在 Dymola 中隐藏模拟变量

    模拟模型后是否可以隐藏对象或输出 我有很多东西 我觉得我在浪费时间筛选它们试图找到我的正确答案 如果没有 有没有办法组织我的输出在模拟选项卡中的显示方式 Thanks Dymola 的主要可能性是 使组件受到保护 默认情况下 受保护的组件不
  • FMU FMI模拟,设置某类参数时不修改结果

    我为该示例开发了一个基于 MSL 流体库的简单 Modelica 模型 我将 MassFlowSource 与管道和 Boundary PT 连接为接收器功能 如下图所示 http www casimages com img php i 1
  • 如何将一个向量的参数插入另一个向量?

    我有一个大小为 5 的 重心 向量 parameter Length barycenters 5 1 2 3 4 5 我想将此向量的参数添加到另一个大小为 7 的向量 b prime 中 这意味着打算让 b prime 0 1 2 3 4
  • 使用内部/外部传播包

    我想在我的模拟中放置一个 系统 组件 类似于Modelica Fluid System and Modelica Mechanics MultiBody World 所有其他组件都可以从中访问Medium包 以便在整个流程图中仅设置一次工作
  • 理解 Dymola 错误消息时遇到问题

    谁能告诉我 代数环 的含义 以及我应该如何通过添加 预 运算符来应对这种情况 我真的没看懂 Error Failed to generate code for an algebraic loop involving when equatio
  • 使用 pyFMI 进行模拟时出现 CVodeError

    我尝试在 Anaconda Python 3 6 8 上设置 pyFMI 安装 pyFMI 站点上列出的所有必需软件包 fmu 加载没有问题 但当我尝试模拟 fmu 时 出现错误 Could not find cannot import n
  • Modelica 外部函数:C 与 C99

    在 Modelica 中可以定义外部函数 规范第 12 9 章表示支持 C 和 Fortran77 将来可能会支持 C 和 Fortran90 现在我想知道哪个C 的版本 http en wikipedia org wiki C progr
  • DYMOLA:opc 服务器如何使用 MATLAB 使用 dsin.txt 或 mat 文件进行初始化

    我在 DYMOLA 中创建了一个 OPC 服务器 现在我在 DYMOSIM 中有这个可以单击并初始化 使用 dsin txt 的 MAT 文件 现在我在 MATLAB 中创建了一个 GUI 文件 并获取变量的输入并创建了一个 mat 文件

随机推荐

  • 来自 x509 中字符缓冲区的 EVP_PKEY (PKCS7)

    我有一个 DER 证书 我正在从中检索 unsigned char 缓冲区中的公钥 如下所示 这是正确的获取方式吗 pStoredPublicKey X509 get pubkey x509 if pStoredPublicKey NULL
  • 32 位浮点数相加。

    关于浮点数 我学到的东西比我想知道的还要多 可以说我需要添加 1 10000000 00000000000000000000000 1 01111000 11111000000000000000000 2的补码形式 第一位是符号 接下来的
  • 以问号开头的 HTML 标签?

    我正在学习谷歌应用程序脚本 并且在this教程中 我看到了一些奇怪的语法 and h1 Messages h1 ul ul
  • HERE Map/MapView 不使用 MapFragment

    有没有办法获得Map or MapView没有放置一个MapFragmet里面一个Layout
  • .NET 垃圾收集在这里无法正常工作?

    我们有一个在 NET 4 0 IIS 7 ASP NET 4 GB 服务器 RAM 上运行的图像转换脚本 用于调整大图像的大小 因此需要大量内存 第一个脚本将内存使用率增加到几乎 100 几乎没有为正在运行的 SQL Server 留下任何
  • 更改 R 中图形的字体

    在我的研究中 我使用 R 生成各种图表 我发现大多数图表都带有各种大小的 Sans Serif 字体 如何将图表中的所有文本 x 标签 y 标签 标题 图例等 更改为统一字体 例如Times New Roman 12pt 粗体 您可以使用外
  • Wildfly 和 Jackson @JsonIgnore 注释

    我对 Wildfly 和 Java EE 的某些部分相当陌生 我有一个使用 RestEasy 在 Wildfly 上运行的休息服务 我的 用户 实体有一个 AccessToken 实体 理想情况下 我希望能够以 JSON 形式发送用户实体
  • 如何获取一组 mysql 总行数的百分比?

    下面我有一个查询 将从用户代理表和 IP 地址链接表中获取站点最常见的用户代理 SELECT count as num string FROM useragent ip left join useragents on useragent i
  • 龙卷风框架(FacebookGraphMixin)

    我想尝试使用 Tornado Framework 将应用程序请求从我的 Facebook 应用程序发送到用户 我正在关注http www tornadoweb org documentation auth html但我不知道如何解决这个错误
  • 在 Node.js 跨平台中下载和解压缩文件的最简单方法?

    只是寻找一个简单的下载和解压解决方案 zip or tar gz任何操作系统上 Node js 中的文件 不确定这是否是内置的 或者我必须使用单独的库 有任何想法吗 只需寻找几行代码 这样当下一个 zip 文件出现时我想在节点中下载 这是理
  • Angular2 Dart - 获取 Angular2 组件内的文本

    我有一个item我在其他组件中使用的组件 项目组件通常如下所示
  • R 中均值的分组条形图

    我有一个数据集 学习者 其中包含学生测试成绩 学习者 literacy total 他们的年级 即1 2 3 12年级 和他们的性别 学习者 性别 我想创建一个条形图 其中 x 轴上有成绩 y 轴上有平均分数 每个成绩有两列 一列用于男性
  • 如何在 django 上自动创建超级用户?

    我要自动运行manage py createsuperuser on django但似乎无法设置默认密码 我怎样才能得到这个 它必须独立于 django 数据库 从 Django 3 0 开始 您可以使用默认值createsuperuser
  • 将 JPanel 与 Eclipse 的 WindowBuilder 重叠

    我正在使用 WindowBuilder Pro 进行 eclipse 并且我希望有两个彼此完美重叠的 Jpanels 然后我就可以根据组合框的选择来切换它们的可见性 当我尝试在 GUI 构建器中实现此目标时 第一个面板被第二个面板取代 请给
  • 如何处理应用程序被HOME按钮最小化

    前几天出现了一个问题 我有一个监听 GPS 位置的应用程序 监听器是一个始终工作的后台服务 该服务在应用程序级别保存数据 每个活动都会读取该数据 因此 当我按下后退按钮时 我能够捕获此事件 并且可以停止服务 但是当我按下 HOME 按钮时
  • CocoaPods 文件夹不存在/权限错误

    我是 CocoaPods 的新手 我尝试过运行 pod install 在我的 Mac 上安装我的 Pod 但我收到文件夹权限错误 Users username Library Caches CocoaPods 该文件夹甚至不存在 难道是我
  • 如何从 Google 地图 API 函数中获取 javascript lat/lng 变量

    我需要从邮政编码获取纬度 经度 因此我使用 Google 地图 地理编码 API 我无法从地理编码脚本中运行的函数中获取 lat lng 变量 我正在使用的代码如下
  • ADODBAPI 与数据库的打开连接数

    我想数一下没有 当前与 ms access 数据库打开的连接数 例如 两个应用程序正在使用同一个数据库 那么我怎样才能得到这个计数呢 pypyodbc 中是否有 ms access 函数或任何设施 使用adodbapi 我怎么能得到no 与
  • 这是我的 javascript 来调整 iframe 的大小并需要一些编辑

    这是我的 iframe 它位于带有按钮的 div 内 function myFunction var url document getElementById myFrame getAttribute src var newUrl url s
  • 外部函数:从 C 脚本使用 .dll 的替代方法

    这是一个伴随问题外部函数 在 C 脚本中引用头文件来编译 dll 该堆栈溢出问题是使用 Modelica 外部函数调用 c 脚本 然后 该 c 脚本使用 dll 中包含的 c 函数 以下是我尝试过的最初首选方法和我不喜欢的工作尝试 初步尝试