我有以下代码:
var wqry:TAdoQuery;
...
FillChar(wSpaces,cSpacesAfter,' ');
try
wqry := TADOQuery.Create(nil);//here the error
wqry.Connection:=...
cSpacesAfter是一个常量,其值为1035. wSpaces是一个本地字符串变量。问题是我在创建TAdoQuery时收到以下错误
即使是法语,我相信你有这个想法......
如果我评论FillChar代码,一切正常。我有通常的编译器指令,没什么特别的。我正在使用Delphi 7。
有人可以告诉我该代码有什么问题吗?
答案 0 :(得分:3)
麻烦的代码很可能就是这个
FillChar(wSpaces,cSpacesAfter,' ');
我假设wSpaces
是字符串类型。实际上,字符串变量只不过是指向保存字符串的数据结构的指针。您不需要使用指针语法,因为编译器会为您处理。
所以这段代码的作用是覆盖保存带有4个空格字符的指针的变量,然后在变量后面的任何内容上写入1031个空格。简而言之,你将完全破坏你的记忆。这可以解释为什么FillChar
有效但下一行代码会导致痛苦和戏剧性的死亡。
如果你的字符串确实有1035个字符的空间,你可以改写:
FillChar(wSpaces[1], cSpacesAfter, ' ');
然而,如果写作可能更惯用:
wSpaces := StringOfChar(' ', cSpacesAfter);
答案 1 :(得分:1)
FillChar 过程使用相同的字节或字符 FillValue FillCount 次数填充存储缓冲区的一部分。
它主要用于初始化数字数组。它可用于初始化记录和字符串,但应注意避免覆盖长度字段。 StringOfChar 最适合将字符串填充到同一个字符中。
你确定wSpaces的大小足以容纳所有cSpaces吗?写完之后?