小编Tim*_*ram的帖子

delphi中的堆栈溢出错误

我有一个调用几个函数的过程:

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)

stack-overflow delphi

5
推荐指数
1
解决办法
7101
查看次数

使用带有C DLL的delphi dta类型的问题

我试图使用一个用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以不同语言编码可能很危险,所以我认为这可能会导致问题. …

delphi dll matlab

3
推荐指数
1
解决办法
166
查看次数

从字符中读取单个位

这是我在这里的第一篇文章所以请原谅我做错了:)这是我的情况.我正在使用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)

我不明白为什么不会因为编译器将其转换为汇编而无论如何?!!!!

提前致谢.此致,蒂姆.

c embedded pic

2
推荐指数
1
解决办法
7313
查看次数

替代动态创建变量名称

我有一个头文件(不是由我编写的,我无法更改),其中包含以下格式的定义:

#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)

c++

2
推荐指数
1
解决办法
95
查看次数

不能在delphi中使用IF NOT

我有一组字符,我在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'?

delphi if-statement set

1
推荐指数
1
解决办法
3969
查看次数

读取和写入64位int中的各个位.

我必须在一个变量中存储多达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)

delphi bit-shift

0
推荐指数
1
解决办法
1112
查看次数

标签 统计

delphi ×4

bit-shift ×1

c ×1

c++ ×1

dll ×1

embedded ×1

if-statement ×1

matlab ×1

pic ×1

set ×1

stack-overflow ×1