0

私は次のコードを持っています:

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

cSpacesAfterは定数で、値は1035です。wSpacesはローカル文字列変数です。問題は、TAdoQueryの作成時に次のエラーが発生することです。

ここに画像の説明を入力してください

フランス語でも、あなたはその考えを理解したと思います。

FillCharコードにコメントすると、すべて問題なく動作します。私は通常のコンパイラ指令を持っていますが、特別なことは何もありません。Delphi7を使用しています。

誰かがそのコードの何が問題なのか教えてもらえますか?

4

2 に答える 2

3

厄介なコードはおそらくこれです

FillChar(wSpaces,cSpacesAfter,' ');

wSpaces文字列型だと思います。文字列変数は、実際には、文字列を保持するデータ構造へのポインタにすぎません。コンパイラが自動的に処理するため、ポインタ構文を使用する必要はありません。

したがって、このコードは、そのポインターを保持している変数を4つのスペース文字で上書きしてから、変数の後に続くものの上にさらに1031個のスペースを書き込みます。要するに、あなたはあなたの記憶を完全に破壊するでしょう。それはなぜFillChar機能するのかを説明しますが、コードの次の行は痛みを伴う劇的な死を迎えます。

文字列に実際に1035文字のスペースがある場合は、代わりに次のように記述できます。

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

ただし、書くのがもっと慣用的な場合は、次のようにします。

wSpaces := StringOfChar(' ', cSpacesAfter);
于 2011-05-09T13:19:21.270 に答える
1

FillCharプロシージャは、ストレージバッファのセクションに同じバイトまたは文字のFillValueFillCount回を入力します。

これは主に、数値の配列を初期化するために使用されます。レコードと文字列を初期化するために使用できますが、長さフィールドを上書きしないように注意する必要があります。StringOfCharは、同じ文字に文字列を入力するのに最適です。

あなたがそれに書いた後、wSpacesがすべてのcSpacesに合うのに十分なサイズを持っていると確信していますか?

于 2011-05-09T13:12:54.640 に答える