2011-05-09 30 views
0

我有以下代码:的Delphi - ADO查询和FillChar生成错误

var wqry:TAdoQuery; 
... 
    FillChar(wSpaces,cSpacesAfter,' '); 
    try 
    wqry := TADOQuery.Create(nil);//here the error 
    wqry.Connection:=... 

cSpacesAfter是常数,并且具有值1035 wSpaces是一个局部字符串变量。问题是,我收到以下错误创建TAdoQuery当

enter image description here

即使它是在法国,我相信你上心.....

如果我评论的FillChar代码,一切正常。我有通常的编译器指令,没有什么特别的。我正在使用德尔福7.

有人可以告诉我什么是错的代码?

+0

如果这是复制粘贴代码,你”重新初始化'wqry',但使用'wry'。请注意第二个名字中缺少“q”。如果它不是复制粘贴的代码,请修复它(通过复制粘贴代码) – 2011-05-09 13:00:41

+0

wSpaces:= stringofchar('',cSpacesAfter); - 解决了问题。没有错误发生。 – RBA 2011-05-09 13:22:28

+0

谢谢你的-1。的确,这是一个愚蠢的问题,缺乏睡眠的言论。如果添加了setlength(wSpaces,cSpacesAfter + 1),则为 – RBA 2011-05-09 19:35:41

回答

3

麻烦的代码是最有可能这一个

FillChar(wSpaces,cSpacesAfter,' '); 

我假设wSpaces是字符串类型。实际上,字符串变量只不过是指向保存字符串的数据结构的指针。您不需要使用指针语法,因为编译器会为您处理。

因此,这段代码的作用是用4个空格字符覆盖保存该指针的变量,然后在变量之后的顶部写入1031个空格。总之你会完全破坏你的记忆。这可以解释为什么FillChar可以工作,但是下一行代码却死于痛苦而戏剧性的死亡。

如果字符串确实有空间为1035个字符,您可以改为写:

FillChar(wSpaces[1], cSpacesAfter, ' '); 

但是,如果可能更习惯这样写:

wSpaces := StringOfChar(' ', cSpacesAfter); 
+0

是的,wSpaces是一个本地字符串变量。FillChar(wSpaces [1],cSpacesAfter,''); - 生成000000 .. AV。 – RBA 2011-05-09 13:29:13

+0

@RBA如果你不先分配一些存储空间,它只会生成一个AV!无论如何,StringOfChar就是你在上面评论中所说的答案。 – 2011-05-09 13:33:23

+0

绝对我需要一些睡眠......谢谢。 – RBA 2011-05-09 14:02:45

1

FillChar过程填写存储缓冲具有相同字节或字符FillValue FillCount倍的部分。它主要用于初始化数组数组。它可以用来初始化记录和字符串,但应该注意避免覆盖长度字段。 StringOfChar最适合将字符串填充到同一个字符。

您确定wSpaces的大小足以适合cSpaces的所有大小写入之后吗?

+0

;在FillChar函数之前,错误仍然生成。 – RBA 2011-05-09 13:20:24

+0

你将不得不这样做:'Setlength(wSpaces,cSpacesAfter); FillChar(wSpaces [1],cSpacesAfter,'');'根据我的回答,但'StringOfChar'好得多。 – 2011-05-09 13:25:38