2016-08-08 33 views
-1

私は45の値を配列sampleに保存しています。 sample1,sample2およびsample3の3つの個別の配列に分割する必要があります。sample1の最初の15個、sample2の次の15個、残りの15個をsample3に分割する必要があります。アレイを3つの個別のアレイに分割する

var 
    sample: array of integer; // Source Array which contains data 
    sample1, sample2, sample3: array of integer; //Target arrays which needs to be worked upon 
    i: integer; 
begin 
SetLength(sample1, 15); 
SetLength(sample2, 15); 
SetLength(sample3, 15); 
for i := 0 to 14 do 
    sample[i] := sample1[i]; 
for i:= 15 to 29 do 
    sample[i] := sample2[i]; 
for i:= 30 to 44 do 
    sample[i] := sample3[i]; 
i := i + 1; 

私は最初の配列ではなく、他の配列で結果を得ることができています:私はこのコードでいることを実行しようとしました。私は間違って何をしていますか?

+2

ソース配列のインデックスをオフセットする必要があります。 *例:*、 '...:= sample2 [i-15]'。それ以外の場合は、間違ってインデックスを作成しています(15〜29)。 – lurker

+0

私は前にインデックスを作成しましたが、それでもうまくいきません。 – delsql

+0

あなたのコードには、他の問題があるか、少なくとも不完全なものがあります。 'sample'の長さが設定されていないなど、ループがありません。直前に試みた実際のコードを断片化せずに表示してください。 – lurker

答えて

1

私があなたをよく理解していれば、あなたが望むものは次のとおりです。私はあなたのsample配列が正確に45のアイテムを持っていると仮定し、あなたはおそらくこれをしたい:

トリックを行う必要があります
var 
    sample: array of Integer; 
    sample1, sample2, sample3: array of Integer; 
    i: Integer; 
begin 
    SetLength(sample, 45); 
    { fill sample with values } 
    ... 
    { now split: } 
    SetLength(sample1, 15); 
    SetLength(sample2, 15); 
    SetLength(sample3, 15); 
    for i := 0 to 14 do 
    begin 
    sample1[i] := sample[i]; 
    sample2[i] := sample[i + 15]; { i = 0..14, so i+15 = 15..29 } 
    sample3[i] := sample[i + 30]; { i = 0..14, so i+30 = 30..44 } 
    end; 

。これがあなたの望むものでない場合は、あなたの問題をもう少し詳しく述べるべきです。配列sampleが長い場合、これはすべてを分割することはありません。 sample配列が短い場合、オーバーフローが発生し、エラーまたは未定義の動作が発生します。

+0

ここでコメントをすべて削除しました。手のしかし、私はこれを言うでしょう:ただ役立つようにしようとしている回答者を退屈させることは、私が感謝するものではありません。 –

+0

@ブラッドは理解しています。私は個人的に質問を修正せずに貧しい質問に答えることは実際にサイトに役立つとは思わない。おそらく私はSOの質問の質が低下するのを受け入れる必要があります。 –

+0

FWIW、わかりやすくなるように質問を編集しました。しかし、私はもちろんコードを変更しませんでした。 –

3

ターゲットアレイをソースアレイに割り当てます。代わりに、ターゲットアレイをソースアレイに割り当てます。とにかく間違ったインデックスを使用しています。

より代わりにこのような何か試してみてください:

また
var 
    sample: array of integer; 
    sample1, sample2, sample3: array of integer; 
    i: integer; 
begin 
    ... 
    SetLength(sample1, 15); 
    SetLength(sample2, 15); 
    SetLength(sample3, 15); 
    for i := 0 to 14 do 
    sample1[i] := sample[i]; 
    for i := 0 to 14 do 
    sample2[i] := sample[15+i]; 
    for i := 0 to 14 do 
    sample3[i] := sample[30+i]; 
    ... 

var 
    sample: array of integer; 
    sample1, sample2, sample3: array of integer; 
    i: integer; 
begin 
    ... 
    SetLength(sample1, 15); 
    SetLength(sample2, 15); 
    SetLength(sample3, 15); 
    for i := 0 to 14 do 
    begin 
    sample1[i] := sample[i]; 
    sample2[i] := sample[15+i]; 
    sample3[i] := sample[30+i]; 
    end; 
    ... 

ターゲットアレイはとにかくダイナミックなので、私が代わりにすべての手動ループのCopy()を使用することをお勧めします:

var 
    sample, sample1, sample2, sample3: array of integer; 
begin 
... 
sample1 := Copy(sample, 0, 15); 
sample2 := Copy(sample, 15, 15); 
sample3 := Copy(sample, 30, 15); 
+1

OPが使用していると思われるDelphi 7のような古いバージョンでは、 'Copy()'がこれを(開始インデックスなどで)行うことはできません。 D7がインストールされていないのでチェックできません。 –

+0

WIW、最初のコードスニペットには、1つ目の 'begin'が多すぎます(' for'の最後)。 –

+1

@RudyVelthuisはいできます。実際、Copy()メソッドは、Delphiの最新バージョンと同じパラメータを受け入れることができるTurbo Pascal以来、あまり変わっていません。 – SilverWarior

関連する問題