![]() |
行走的键盘 · Delphi-使用TNetHTTPReque ...· 1 月前 · |
![]() |
自信的凳子 · TIOBE 3 月榜单:Fortran 和 ...· 4 周前 · |
![]() |
文质彬彬的大象 · 2020年3月TIOBE编程语言排行榜来了! ...· 4 周前 · |
![]() |
老实的充值卡 · FFmpeg 编解码器文档_ FFmpeg中文网· 4 月前 · |
![]() |
月球上的菠菜 · 文件系统作为缓存时的路径生成方案 - 0xFFFF· 5 月前 · |
![]() |
痴情的啄木鸟 · Error importing ...· 5 月前 · |
![]() |
坏坏的蟠桃 · 〖exagear〗Jsk新作“魔法少女榴璃香 ...· 7 月前 · |
![]() |
有腹肌的板栗 · 第一章 中国共产党的创立和投身大革命的洪流- ...· 10 月前 · |
我正在尝试使用用C编写的.dll (尽管它封装在matlab .ddl上)。
我试图使用的函数在C中定义为:
__declspec(dllexport) int ss_scaling_subtraction(double* time, double** signals, double* amplitudes, int nSamples, int nChannels, double* intensities);
除其他外,.dll需要一个二维数组--当我尝试使用:
Array of array of double
在声明中,编译器给出了一个错误,因此我定义了自己的数据类型:
T2DArray = Array of array of double;
我在如下所示的单元中初始化.dll函数:
function ss_scaling_subtraction(const time: array of double; const signals: T2DArray; const amplituides : array of double; const nSamples: integer;const nChannels: integer; var intensities: array of double) : integer ; cdecl; external 'StirScanDLL.dll';
但是,当调用此函数时,我会从.dll获得一个访问冲突。
创建新的数据类型
T1DArray = array of double
和变化
Array of double
至
T1DArray
在声明中似乎让事情运行,但结果仍然不正确。
我在这里读到,将delphi数据类型传递给用不同语言编写的..dll可能是危险的,所以我认为这可能会导致问题。
但是,当我必须首先正确声明函数时,如何不用delphi数据类型呢?!
额外的信息,我已经打开了matlab运行时编译器库并打开了StirScanDLL.dll的入口点
发布于 2014-06-13 18:08:39
这里的基本问题是二进制互操作失配。简单地说,指向数组的指针与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;
也就是说,指向指向双的指针。
现在剩下的就是调用函数。在Delphi中将数组声明为动态数组。如下所示:
var
time, amplitudes, intensities: TArray<Double>;
signals: TArray<TArray<Double>>;
如果您有一个旧的预泛型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),