どのようになることをここに宣言します配列がわからないの長さで走行す。
-
10-07-2019 - |
質問
私はもともとあった配列[1..1000]定義したとしてグローバル変数となります。今がそれを必要とするnは1000んべnます。ううnは前記配列を設が必要であるグローバルが必要である方法を定義するサイズのグローバル配列です。
コンテキストが充填配列との線形変換によるバイトは、ファイルです。しかできなファイルまでどなたか希望があるようでしたそれを開くと、ファイルのサイズです。
解決
としてのインターネットで提供4デルファイバイスプレジデント対応 動的配列.を修正することができサイルの実行時にそのデータを格納、その他の元素のサイズです。しながら、素子の均一なタイプを含むの記録その他のarrays.きを宣言する動的配列と同じとを宣言するのに通常の"静"の配列が単に省略の配列範囲:
var
ArthurArray: array of TForm;
は静的配列により指定を結びつけ、低価指数の動的な配列は常にゼロとなります。の高い指標によってシフトします。 High
機能を返します一つ以上の長さの配列になります。のための動的配列 x
, High(x) = Length(x)-1
.
グローバル変数にアクセスできる任意のコードを含む地域。
グローバル変数のダイナミック-アレイの初期化する 空 配列に格納します。その長さがゼロと High
と呼ばれる配列のときは-1 Low
この配列が返さゼロになります。
随時、リサイズの動的配列になります。をご利用 SetLength
機能いたりしているのと同じようにできない文字列:
var
NumElements: Integer;
begin
NumElements := GetNumberOfArthurForms();
SetLength(ArthurArray, NumElements);
end;
また多次元配列を設定できますその長さループ:
var
matrix: array of array of Double;
i: Integer;
begin
SetLength(matrix, height);
for i := 0 to height - 1 do
SetLength(matrix[i], width);
end;
あるショートカットのためセットの長さがすべての内部配列を一度に:
begin
SetLength(matrix, height, width);
end;
のように述べた動的配列を古い値ときにリサイズ:イメージ
var
data: array of string;
begin
SetLength(data, 2);
data[1] := 'foo';
SetLength(data, 20);
Assert(data[1] = 'foo');
end;
だ 短縮 配列の要素が滞在を超えて新しい要素がいなくなった永遠に:
begin
SetLength(data, 20);
data[15] := 'foo';
SetLength(data, 2);
// data[15] does not exist anymore.
SetLength(data, 16);
writeln(data[15); // Should print an *empty* line.
end;
私のデモ以上使用の文字列です。文字列は特殊なイン;彼らのコンパイラを通しての参照が可能となります。それにともない、新たにダイナミック-配列要素の型が文字列に初期化されます。なければならないとしたら使う整数であり保証値の新しい要素を取り込んしている可能性もありますが、ゼロがしている可能性もありますが何よりも、初期値のローカル変数.
のデ7ヘルプファイルのものとなってくれていると述べた。お確かめください動的配列であります。きのデモを通して利用VCLは、RTLソースコード提供ズの設置など、ほとんどのデコード例では生産された最後の10年となります。
他のヒント
まず、質問の最初の部分に対する一般的な回答を次に示します。
配列が静的でなくなった場合は、TList、TStringList、またはContnrsユニットの多くのコンテナクラスのいずれかを使用することを検討できます。
彼らはあなたが何をしているのかをより良く表し、必要かもしれない追加の機能を提供します。並べ替えまたは名前/値のペア、それらは必要に応じて動的に成長し、非常に最適化されています。
それからあなたは言った:
"コンテキストは、ファイル内のバイトの線形変換で配列を埋めています。誰かがそれを開きたいと思うまで、ファイルの大きさはわかりません。ファイルはどんなサイズでもかまいません。
特定の問題については、次を使用してファイルのバイトをロードします。
MyFileStream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite); Size := MyFileStream.Size - MyFileStream.Position; SetLength(Buffer, Size); MyFileStream.Read(Buffer[0], Size);
その後、PCharポインターを使用して、バッファー内の各文字または各バイトを1つずつ通過し、必要に応じて変換することができます。