【问题标题】:Delphi - ADO query and FillChar generates errorsDelphi - ADO 查询和 FillChar 生成错误
【发布时间】:2011-05-09 12:54:14
【问题描述】:

我有以下代码:

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

cSpacesAfter 是一个常量,值为 1035。wSpaces 是一个本地字符串变量。问题是我在创建 TAdoQuery 时收到以下错误

即使是法语,我相信你明白了.....

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

谁能告诉我这段代码有什么问题?

【问题讨论】:

  • 如果那是复制粘贴的代码,您正在初始化wqry,但使用wry。请注意第二个名称中缺少的 q。如果不是复制粘贴代码,请修复(通过复制粘贴代码)
  • wSpaces:=stringofchar(' ',cSpacesAfter); - 解决了问题。没有引发错误。
  • 感谢您的 -1。确实,这是一个愚蠢的问题,睡眠不足是它的保证。

标签: string delphi delphi-7 tadoquery


【解决方案1】:

麻烦的代码很可能是这个

FillChar(wSpaces,cSpacesAfter,' ');

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

所以这段代码所做的就是用 4 个空格字符覆盖持有该指针的变量,然后在变量后面的任何内容的顶部再写 1031 个空格。简而言之,您将完全破坏您的记忆。这可以解释为什么 FillChar 可以工作,但下一行代码会痛苦而戏剧性地死去。

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

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

但是,如果写起来可能更惯用:

wSpaces := StringOfChar(' ', cSpacesAfter);

【讨论】:

  • 是的,wSpaces 是一个本地字符串变量。 FillChar(wSpaces[1], cSpacesAfter, ' '); - 生成 000000.. AV。
  • @RBA 如果您不先分配一些存储空间,它只会生成一个 AV!无论如何,正如您在上面的评论中所说,StringOfChar 是您的答案。
【解决方案2】:

FillChar 过程用相同的字节或字符FillValue FillCount 次填充一段存储Buffer

它主要用于初始化数字数组。它可用于初始化记录和字符串,但应注意避免覆盖长度字段。 StringOfChar 最适合将字符串填充到相同的字符。

您确定 wSpaces 的大小足以容纳所有 cSpaces 在您写入之后吗?

【讨论】:

  • 如果添加 setlength(wSpaces,cSpacesAfter+1);在 FillChar 函数之前,仍然会产生错误。
  • 根据我的回答,您必须这样做:Setlength(wSpaces, cSpacesAfter); FillChar(wSpaces[1], cSpacesAfter, ' ');,但 StringOfChar 要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多