我有一个调用几个函数的过程:
procedure TForm1.Button1Click(Sender: TObject);
var
rawData: TRawData;
rawInts: TRawInts;
processedData: TProcessedData;
begin
rawData := getRawData();
rawInts := getRawInts(rawData);
processedData := getProcessedData(rawInts);
end;
Run Code Online (Sandbox Code Playgroud)
数据类型定义如下:
TRawData = array[0..131069] of Byte;
TRawInts = array[0..65534] of LongInt;
TProcessedData = array[0..65534] of Double;
Run Code Online (Sandbox Code Playgroud)
只运行程序:
rawData := getRawData();
rawInts := getRawInts(rawData);
Run Code Online (Sandbox Code Playgroud)
工作完全没问题.但是,当我尝试运行时:
getProcessedData(rawInts)
Run Code Online (Sandbox Code Playgroud)
我收到stackoverflow错误.我不明白为什么会这样.功能代码getProcessedData
非常简单:
function getProcessedData(rawInts : TRawInts) : TProcessedData;
var
i: Integer;
tempData: TProcessedData;
scaleFactor: Double;
begin
scaleFactor := 0.01;
for i := 0 to 65534 do
tempData[i] := rawInts[i] * scaleFactor;
Result …
Run Code Online (Sandbox Code Playgroud) 我试图使用一个用C语言编写的.dll(尽管它包含了一个matlab .ddl)
我尝试使用的函数在C中定义为:
__declspec(dllexport) int ss_scaling_subtraction(double* time, double** signals, double* amplitudes, int nSamples, int nChannels, double* intensities);
Run Code Online (Sandbox Code Playgroud)
除其他外,.dll需要一个二维数组 - 当我尝试使用时:
Array of array of double
Run Code Online (Sandbox Code Playgroud)
在声明中,编译器发出错误,因此我定义了自己的数据类型:
T2DArray = Array of array of double;
Run Code Online (Sandbox Code Playgroud)
我在一个单元中初始化.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';
Run Code Online (Sandbox Code Playgroud)
但是,当调用此函数时,我从.dll获取访问冲突
创建新数据类型
T1DArray = array of double
Run Code Online (Sandbox Code Playgroud)
和改变
Array of double
Run Code Online (Sandbox Code Playgroud)
至
T1DArray
Run Code Online (Sandbox Code Playgroud)
在声明似乎使事情运行但结果仍然不正确.
我在这里读到,将delphi数据类型传递给.dll以不同语言编码可能很危险,所以我认为这可能会导致问题. …
这是我在这里的第一篇文章所以请原谅我做错了:)这是我的情况.我正在使用MPLAB和HI-Tech C编译器为PIC16F876编写简单的数据传输操作.
我有一个叫做数据的字符,我想访问数据中的位并将它们发送到portB0,从MSB开始.
在汇编中我会做:
PORTB,0 = data,7
//为了获得MSB并将其放在端口B0上,我会为所有位执行此操作.
然而在C中,这似乎更复杂.我做了一些研究,发现了一个有效的功能:
getBit(char data, int bitNumber)
{
return (data & (1 << bitNumber-1)) != 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我就用了:
PORTBbits.RB0 = getBit(data,7);
Run Code Online (Sandbox Code Playgroud)
这没关系,但是很乱,似乎需要更长的时间,我不知道为什么我需要一个额外的功能...所以我的问题是:是否有一个简单的方法来访问寄存器中的位?喜欢:
PORTBbits.RB0 = data,7
Run Code Online (Sandbox Code Playgroud)
我不明白为什么不会因为编译器将其转换为汇编而无论如何?!!!!
提前致谢.此致,蒂姆.
我有一个头文件(不是由我编写的,我无法更改),其中包含以下格式的定义:
#define SPC_TMASK0_NONE 0x00000000
#define SPC_TMASK0_CH0 0x00000001
#define SPC_TMASK0_CH1 0x00000002
#define SPC_TMASK0_CH2 0x00000004
#define SPC_TMASK0_CH3 0x00000008
#define SPC_TMASK0_CH4 0x00000010
#define SPC_TMASK0_CH5 0x00000020
#define SPC_TMASK0_CH6 0x00000040
#define SPC_TMASK0_CH7 0x00000080
#define SPC_TMASK0_CH8 0x00000100
#define SPC_TMASK0_CH9 0x00000200
#define SPC_TMASK0_CH10 0x00000400
#define SPC_TMASK0_CH11 0x00000800
#define SPC_TMASK0_CH12 0x00001000
#define SPC_TMASK0_CH13 0x00002000
#define SPC_TMASK0_CH14 0x00004000
#define SPC_TMASK0_CH15 0x00008000
#define SPC_TMASK0_CH16 0x00010000
#define SPC_TMASK0_CH17 0x00020000
#define SPC_TMASK0_CH18 0x00040000
#define SPC_TMASK0_CH19 0x00080000
#define SPC_TMASK0_CH20 0x00100000
#define SPC_TMASK0_CH21 0x00200000
#define SPC_TMASK0_CH22 0x00400000
#define SPC_TMASK0_CH23 0x00800000
#define SPC_TMASK0_CH24 0x01000000
#define …
Run Code Online (Sandbox Code Playgroud) 我有一组字符,我在TYPE部分中定义为:
TAmpls = set of '1'..'9'';
Run Code Online (Sandbox Code Playgroud)
在我的函数中,我在var部分中声明了一个新变量,类型为Tampls:
myAmpls : Tampls;
Run Code Online (Sandbox Code Playgroud)
然后,我使用以下命令取消分配myAmpls中的所有内容:
myAMpls := [];
Run Code Online (Sandbox Code Playgroud)
然后我找到一个整数(我称之为n).如果我的set变量中没有分配这个数字,我想分配它,为此我尝试使用:
if not chr(n) in myAmpls then include(myAmpls,chr(n));
Run Code Online (Sandbox Code Playgroud)
但编译器抛出错误说:
'Operator not applicable to this operand type'
Run Code Online (Sandbox Code Playgroud)
如果我删除'not',代码编译得很好,为什么会这样?
我原以为n是否已经在myAmpls中是布尔值,为什么我不能使用'not'?
我必须在一个变量中存储多达7个字节的数据,并能够读取和写入各个位.有4个字节,这是小菜一碟,我只是使用for循环并执行一次移位来写入该位或读取它:
data : int64;
data := $01 + ($00 shl 8 ) + ($00 shl 16 ) + ($FF shl 24);
for i := 31 downto 0 do
begin
if ((data shr i) and 1) = 1 then ShowMessage('data bit was one')
else ShowMessage('data Bit was Zero');
end;
Run Code Online (Sandbox Code Playgroud)
这将以正确的顺序读出位.
但是,当我尝试使用此方法超过32位似乎倒下时:
data : int64;
data := $01 + ($00 shl 8 ) + ($00 shl 16 ) + ($00 shl 24) + ($FF shl 32);
for i := 39 downto 0 …
Run Code Online (Sandbox Code Playgroud)