![]() |
不拘小节的瀑布 · 基辛格为何认为中国人赢得了朝鲜战争,而苏联是 ...· 1 年前 · |
![]() |
奔放的黄瓜 · 揭阳市委常委、常务副市长刘盛发严重违纪正接受 ...· 1 年前 · |
![]() |
威武的钥匙扣 · 市政府关于授予肖颖等同志见义勇为称号和表彰见 ...· 1 年前 · |
![]() |
冷冷的香菜 · 斗罗大陆:同样为神位传承者献祭,波塞西获得了 ...· 1 年前 · |
![]() |
性感的橙子 · 特斯拉第三季度交付超34万辆 ...· 1 年前 · |
我正在尝试使用用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),