5

これは、ここにある私の以前の質問の続きです。基本的に、基本的な例で dll/関数をテストしようとしていますが、「E2010 - 非互換の型: AInteger/ADouble および Set」および「E1012 - 定数式がサブ範囲境界に違反しています」というエラーが配列で発生します。私はそれが言おうとしていることを(ある程度)理解していますが、何を修正すべきかわかりません。例えば:

var
  n: Integer; 
  Ap, Ai: AInteger;
  Ax, b: ADouble;

begin
  // Initializations
  n := 5;
  Ap := [0, 2, 5, 9, 10, 12]; <- E2010
  Ai := [0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4]; <- E2010
  Ax := [2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1]; <- E2010 and E1012
  b := [8, 45, -3, 3, 19]; <- E1012

とタイプは私の配列ですAIntegerADouble

ADouble = array[0..High(Integer) div SizeOf(Double) - 1] of Double;
AInteger = array[0..High(Integer) div SizeOf(Integer) - 1] of Integer;

これらは C で記述されているため、この方法で初期化する必要があります (Rudy の Delphi ページやその他の C-to-Pascal ソースによると) double Ax[]。 dll ですが、例/解決策が見つからないため、グーグルで間違っている可能性があります。したがって、質問形式で:

Q1 : E1012 は、

「そして、これらの[AInteger and ADouble]のようなことを行う場合、High(Integer) に近づきすぎないように注意してください。データ構造が大きすぎるとコンパイラが文句を言う可能性があるからです。」(Rudyのページより引用)

Q2 : このコードをどのように変更すればよいですか?

助けてくれてありがとう。

4

3 に答える 3

10

このような構文でこれを行うことができます。

配列を次のように定義します。

ADouble = array[0..High(Integer) div SizeOf(Double) - 1] of Double;

32ビットRAM全体のサイズの整数の配列を初期化します! そのような変数を割り当てることはできません (Win64 のみですが、6 つの整数のみを格納するために 4 GB の RAM を使用します)。:)

配列は動的である必要があります。つまり、実行時にサイズが変化する必要があります。したがって、次のように定義する必要があります。

type
  AInteger =  array of integer;

このような配列は、言語の現在の状態であるAFAIRでは直接割り当てることができません。

したがって、そのような関数を書く必要があります:

procedure SetArray(var dest: AInteger; const values: array of integer);
begin
  SetLength(dest,Length(values));
  move(values[0],dest[0],length(values)*sizeof(integer));
end;

また、定数配列をソースとして使用できます。

const
  C: array[0..5] of Integer = (0, 2, 5, 9, 10, 12);
var
  Ap: AInteger;
begin
  SetArray(Ap,C);

または、オープン配列パラメーターを使用します。

var
  Ai: AInteger;
begin
  SetArray(Ai,[0, 2, 5, 9, 10, 12]);

もちろん、2 番目のソリューションは、期待に近いように聞こえます。

更新:新しいバージョンでは、もちろん動的配列コンストラクターを使用できます。

var
  Ai: AInteger;
begin
  Ai := AInteger.Create(0,2,5,9,10,12);

更新 2: XE7 以降、別のよりクリーンな構文を使用できます。

var
  Ai: AInteger;
begin
  Ai := [0,2,5,9,10,12];
于 2013-06-18T05:37:19.913 に答える
0

この質問はオープン配列とは関係がないため、質問からそのタグを削除してください。

使用しているブラケット構文Setは、基本的に各ビットがその位置の値に対応する特殊なタイプのビットマスクである値の宣言です。つまり、[0, 2, 5, 9, 10, 12]Set of Integer6 つの要素を含む であり、ビット 0 は値 0 を参照し、ビット 1 は値 2 を参照し、ビット 2 は値 5 を参照します。あなたがしようとしているSetように、配列に直接割り当てることはできません。

于 2013-06-17T22:03:28.937 に答える