8

Delphi (Delphi 2005) で他の定数に基づいた const を定義しようとしていますが、Delphi はそれが定数式ではないことに不満を持っています。これは私のコードがどのように見えるかです:

program myProgram;

const
  Xpoints = 20;
  Ypoints = 30;
  ArraySize = trunc(sqrt(Xpoints*Ypoints));

var
  myArray : array[1..ArraySize] of integer;

ArraySize = Xpoints*Ypoints を実行できますが、sqrt が問題を引き起こします。アイデアは、定数 Xpoints と Ypoints によって配列のサイズを変更したいということです。私はこのようなことができます:

program myProgram;

const
  sqrtXpoints = 4.472135956;
  sqrtYpoints = 5.47722557506;
  Xpoints = trunc(sqrtXpoints*sqrtXpoints);
  Ypoints = trunc(sqrtYpoints*sqrtYpoints);
  ArraySize = trunc(sqrtXpoints*sqrtYpoints);

var
  myArray : array[1..ArraySize] of integer;

切り捨ての平方根の値を少し過大評価するように注意してください。sqrtXpoints または sqrtYpoints を変更すると、すべてが正しく更新されますが、このアプローチはとても... ばかげているようです。

一時的な修正として、次のように定数を自分で評価できます。

program myProgram;

const
  Xpoints = 20;
  Ypoints = 30;
  ArraySize = 24;

var
  myArray : array[1..ArraySize] of integer;

しかし、X 点または Y 点を変更すると ArraySize が自動的に更新されないため、これは好きではありません。

コンパイラは、上記の例のようなものや、次のようなさらに単純なもののために、コンパイル時に別の定数の数学関数として定義された定数を評価する方法を知っている必要があるようです:

const
  pi = 4.0*arctan(1.0);

しかし、私はそれを受け入れることができません。助言がありますか?よろしくお願いします。

4

1 に答える 1

7

Delphi では、定数の定義でほとんどの関数を使用できません。しかし、簡単に解決できます。動的配列を使用するだけで、コードから必要なものをすべて計算できます。

const
  Xpoints = 20;
  Ypoints = 30;
var
  myArray : array of integer;

procedure TForm9.FormCreate(Sender: TObject);
begin
  setlength(myArray, trunc(sqrt(Xpoints*Ypoints)));

end;
于 2013-08-26T20:12:03.433 に答える