.dta matlab,matlab - 使用带有C DLL的delphi dta类型的问题 - 堆栈内存溢出
这里的基本问题是二进制互操作不匹配之一。 简单地说,指向数组的指针在二进制级别与Delphi开放数组参数不同。 虽然它们在语义上都表示数组,但二进制表示不同。
C函数声明如下:
__declspec(dllexport) int ss_scaling_subtraction(
double* time,
double** signals,
double* amplitudes,
int nSamples,
int nChannels,
double* intensities
);
在Delphi中声明你的函数:
function ss_scaling_subtraction(
time: PDouble;
signals: PPDouble;
amplitudes: PDouble;
nSamples: Integer;
nChannels: Integer;
intensities: PDouble
): Integer; cdecl; external 'StirScanDLL.dll';
如果您发现未声明PPDouble ,请按以下方式对其进行定义:
type
PPDouble = ^PDouble;
也就是指针指向double的指针。
现在剩下的就是调用这些函数。 在Delphi中将您的数组声明为动态数组。 像这样:
var
time, amplitudes, intensities: TArray;
signals: TArray>;
如果你有一个较旧的pre-generics Delphi,那么声明一些类型:
type
TDoubleArray = array of Double;
T2DDoubleArray = array of TDoubleArray;
然后使用适当的类型声明变量。
接下来,您需要分配数组,并填充从调用者传递给被调用者的任何数据。
SetLength(time, nSamples); // I'm guessing here as to the length
SetLength(signals, nSamples, nChannels); // again, guessing
最后是时候调用这个函数了。 现在事实证明,Delphi的优秀设计师安排将动态数组存储为第一个元素的指针。 这意味着它们不会被用作参数。
retval := ss_scaling_subtraction(
PDouble(time),
PPDouble(signals),
PDouble(amplitudes),
nSamples,
nChannels,
PDouble(intensities)
);
请注意,此处显示的动态数组的强制转换依赖于实现细节。 因此,有些人可能认为最好使用,例如@time[0] ,等等一维数组。 并为幅度创建一个PDouble数组并复制内部数组的第一个元素的地址。 就个人而言,我很依赖这个实现细节。 它确实使编码更加简单。
最后一条建议。 Interop可能很棘手。 这很容易出错。 当你弄错了,代码编译,但在运行时死亡可怕。 带有神秘的错误消息。 导致头部刮伤。
所以,从最简单的接口开始。 接收标量参数的函数。 比如说,接收一个整数,并返回一个整数。 证明你可以做到这一点。 然后转到浮点标量。 然后是一维数组。 最后是二维数组。 沿途的每一步,都会增加复杂性。 当您遇到问题时,您会知道它已归结为最近添加的参数。
你没有采取这种方法。 你已经直接杀死并在你的第一次尝试中实现了一切。 当它失败时,你不知道在哪里看。 将问题分解成小块,并从那些较小的块中构建更复杂的问题。
.dta matlab,matlab - 使用带有C DLL的delphi dta类型的问题 - 堆栈内存溢出相关推荐
- java游戏怎么导入jme3,java - JME:将带有纹理的Cinema 4d模型导入jMonkey Projekt - 堆栈内存溢出...
我的问题是: 现在,我想将其导出到我的jMonkeyEngine中,以将其设置在场景中并对其进行动画处理. 我试图将模型导出为.obj文件并将其加载到我的项目中(只是.obj文件). 结果是我没有纹理 ...
- 类型初始值设定项引发异常. matlab,c# - “ MathWorks.MATLAB.NET.Utility.MWMCR”的类型初始值设定项引发了异常 - 堆栈内存溢出...
" MathWorks.MATLAB.NET.Utility.MWMCR"的类型初始值设定项引发了异常: 我从c#调用,这是MatLab库编译器编译的DLL中的函数. using ...
- matlab输出pdf图片超出边框,matlab - 将Matlab Simulink模型保存为PDF,带有紧密的边界框 - 堆栈内存溢出...
给定Simulink框图(模型),我想生成稍后在LaTeX文档中使用的"屏幕截图". 我希望这个截图是PDF(矢量图形, - > pdflatex),带有一个紧密的边界框,我 ...
- matlab多变量优化,matlab - Matlab使用fminsearch优化多变量 - 堆栈内存溢出
我正在使用Matlab fminsearch来最小化带有两个变量的方程sum((interval-5).^2, 2)*factor间隔是一个包含5个值的向量. 只能从1到30的步长为1的顺序选择它们. ...
- matlab 空间方程,matlab - 如何从MNA方程组到MATLAB中的状态空间[A,B,C,D] mimo? - 堆栈内存溢出...
我想以编程方式从生成的MNA(修正的节点分析)方程组生成状态空间[ABCD]系统. 我不知道要调用哪个MATLAB函数. 我使用Erik Cheever的SCAM 链接脚本生成方程组. 我制作了文件e ...
- matlab对AMD显卡的支持,matlab - 深入学习Matlab与AMD显卡 - 堆栈内存溢出
我怎么能在我的电脑上运行这个例子 ? 我没有Nvidia显卡所以我不能在Matlab中使用Cuda. 我需要用Matlab来完成它,因为我的代码的一半是用Matlab编写的,所有变量都是Matlab格 ...
- matlab编译错误怎么查找,matlab - Matlab mex文件编译错误-“未启用SSE2指令集” - 堆栈内存溢出...
在Matlab中编译mex文件的工具箱时,出现以下错误: In file included from /home/josh/Desktop/Project/code/toolbox/channels/ ...
- matlab读取格式重复,matlab - 为什么Xlsread以字符串形式读取(日期时间) - 堆栈内存溢出...
我正在尝试阅读Excel工作表. 在同一台计算机上,我得到不同的结果. 我应该怎么做才能将日期时间读为日期而不是字符串? 我知道以后可以更改它,但是我需要为Octave和Matlab使用相同的代码. ...
- c 传图片数据给matlab,c++ - 如何通过UDP将数据从C ++应用程序发送到Matlab并进行绘制 - 堆栈内存溢出...
我想使用Winsock通过UDP将数据从我的C ++应用程序发送到Matlab,并实时绘制数字. 例如:我得到了从1到10的数字,我想从C ++发送1,在Matlab中接收它,将其放在图形上(图,条等 ...
最新文章
- Ubuntu 11.04 Unity最常用的31个快捷键
- JavaScript学习 九、事件
- C++走向远洋——26(项目二,2,构造函数与析构函数)
- matlab遗传算法m文件,matlab上安装遗传算法工具箱
- intellij idea 显示打开文件路径按钮
- 纯css制作带三角(兼容所有浏览器)
- Linux 文件目录特殊权限设定(SUID,SGID,SBIT)
- 纽约佩斯大学孔子学院:中国故事
- pip更新后怎么还是旧版本_双城SEO优化_百度算法更新后,企业网站外链该怎么发?...
- win10专业版系统没有休眠选项如何解决?
- 10Gb以太网——数据中心的未来
- Mysql5.7及以上版本的MySQL下载、安装及配置教程(附图)
- sharding技术
- 备战软考信息安全工程师经验
- sql server2008密钥
- 差分进化算法(python实现
- VB操作excel 格式设置及打印页面设置(精简)
- 城市三级联动带城市数据
- Video.js的简单使用介绍
- asp.net实现识别客户端浏览器或操作系统