一次元動的配列を二次元動的配列にコピーしたいのですが、全くわかりません。どなたか簡単なサンプルを書き込んで頂けないでしょうか?よろしくお願いします。
Halbow です。
> 一次元動的配列を二次元動的配列にコピーしたいのですが、全くわかりません。
一次元動的配列を二次元動的配列にコピーする仕方は一通りではありません。
どのようにしたいのか分からないと回答のしようがありません。
コピーなら、たんにやりたいように代入するといいのではないでしょうか。
Halbow 様 ありがとうございます。
単にコピーしたものをコンパイル後実行してみると、
コピーされた方の値をテキストBOXに表示するようにしているのですが、その部分で落ちます。で、落ちたソース部分にマウスカソールを近づけると配列名=()となっていて配列の中身が空になっています。さらに参照できない値となっています。なお配列は構造体です。
Halbow です。
いや、どのようにコピーしたいのかがわかりません。
二次元配列を行と列としてみた場合、一次元配列をどのように行と列にコピー
したいのか不明です。動かないなら、動かないコードを示すことも重要です。
以下の例では最初の行の列に代入しています。
procedure TForm1.Button1Click(Sender: TObject);
var
Parray :array of TPoint;
PParray :array of array of TPoint;
i:integer;
begin
SetLength(Parray,10);
for i := 0 to 9 do Parray[i] := Point(i,i);
SetLength(PParray,10,10);
// 列に代入
for i := 0 to 9 do PParray[i,0] := Parray[i];
Label1.Caption := Format('PP[7,0] = [ %d, %d]',[PParray[7,0].x,PParray[7,0].y]);
end;
初心者で恥ずかしいのですが以下のような感じです。
たとえば一次元配列ColAが256色を格納している(.Col)としてそれを1色ずつ分けて(ColBに)代入したいのです。
for i:=0 to 255 do
SetLength(ColB[i], ColCountB[i]+1);
for i:=0 to 255 do
ColCountB[i]:=0;
for i:=0 to (ColACount-1) do begin
k:=ColA[i].Col;
ColB[k][ColCountB[k]]:=ColA[i];//代入
ColCountB[k]:=ColCountB[k]+1;
end;
記入忘れがありました
for i:=0 to (ColACount-1) do begin //記入忘れ
k=Col[i].Col; //記入忘れ
ColCountB[k]:=ColCountB[k]+1 ; //記入忘れ
end;
for i:=0 to 255 do
SetLength(ColB[i], ColCountB[i]+1);
for i:=0 to 255 do
ColCountB[i]:=0;
for i:=0 to (ColACount-1) do begin
k:=ColA[i].Col;
ColB[k][ColCountB[k]]:=ColA[i];//代入
ColCountB[k]:=ColCountB[k]+1;
end;
Halbow です。
配列の定義部分がありませんので全体が分かりません。
ちょっと一言.
>コピーされた方の値をテキストBOXに表示するようにしているのですが、そ
このコピーがうまくいっていなのでしょうね.
>の部分で落ちます。で、落ちたソース部分にマウスカソールを近づけると配
この落ちるという,抽象的な表現ではわかりづらいですね.
具体的に何か表示されないのですか.
Halbow です。
> この落ちるという,抽象的な表現ではわかりづらいですね.
たぶん、SetLength() で確保した以上のインデックスにアクセスしているのでしょう。
ですから、配列の定義と長さの確保の状態が分からないとなんとも言えないですね。
実際のコードはかなり長いので注目している部分を抽出して書きます。
色々やってみたのですがどうも代入の方法が悪いのではなくて、
配列の宣言等が悪用に感じます。
下記’ColB[k][ColCounB[k]]:=ColA[i] ; //代入’のところを’
ColB[k][ColCounB[k]].Col:=1; としてもだめです。
interface
uses SysUtils;
type
TMyCol = packed record
Col : Byte ; // 色
typ : Byte ;
end;
type TTMyCol = array of TMyCol ;
ColACount : Integer ;
ColCountB : array [0..255] of Integer ;
var
ColA : array of TTMyCol ;
ColB : array[0..255] of TTMyCol ;
function SetCol() : Boolean ;
implementation
function SetCol() : Boolean ;
var
w,k : Word ;
i : Integer ;
begin
for i:=0 to (CalACount-1) do begin //色別に領域を確保
k=ColA[i].Col
ColCountB[k]:=ColCountB[k]+1 ;
end;
for i:=0 to 255 do
SetLength(ColB[i], ColCountB[i]+1)
for i:=0 to 255 do //とりあえず各色のカウンターを0にする
ColCountB[i]:=0;
for i:=0 to (ColaCount-1) do begin
k:=ColA[i].Col;
ColB[k][ColCounB[k]]:=ColA[i] ; //代入
ColCountB[k]:=ColCountB[k]+1 ;
end;
end;
> この落ちるという,抽象的な表現ではわかりづらいですね
具体的にはエラーメッセージ "デバッガ例外が発生"(プロジェクト△△△.exeがERangErrorクラスの例外を生成しました。’範囲チェックエラー’プロセスは停止しています。再開するにはステップ実行または実行を選択してください。)が表示されます。
Halbow です。
type TTMyCol = array of TMyCol ;
var
ColA : array of TTMyCol ;
ということは、ColA は TMyCol の二次元配列ですね。
ColA の SetLength() はどうなってますか? ちゃんと二次元分を確保してますか?
> k=ColA[i].Col
これは k := ColA[i].Col; でしょうけど こちらではコンパイルできません。
二次元配列としてアクセスしていないからです。
ColA[i][j].Col のようになるはずです。
申し訳ありません。
>ColA : array of TTMyCol ;
の部分は TTMyCol : TMyCol ;です。
一次元配列です。
下記の部分で配列の領域を確保できていないです。
for i:=0 to 255 do
SetLength(ColB[i], ColCountB[i]+1)
間違えました。
ColA : TMyCol ;です。
Halbow です。
> ColA : TMyCol ;です。
じゃなくて
ColA:TTMyCol;
じゃないですか?なんだか、わけがわからなくなってきました。もう寝ます。
Halbow です。
こちらでは以下のコードは正しく動作します。
type
TMyCol = packed record
Col : Byte ; // 色
typ : Byte ;
end;
type TTMyCol = array of TMyCol ;
var
ColA : TTMyCol ;
ColB : array[0..255] of TTMyCol ;
ColACount : Integer ;
ColCountB : array [0..255] of Integer ;
function SetCol() : Boolean ;
var
w,k : Word ;
i : Integer ;
begin
ColACount := 100;
SetLength(ColA,ColACount);
for i := 0 to ColACount-1 do ColA[i].Col := Random(256);
for i:=0 to (ColACount-1) do begin //色別に領域を確保
k := ColA[i].Col;
ColCountB[k]:=ColCountB[k]+1 ;
end;
for i:=0 to 255 do
SetLength(ColB[i], ColCountB[i]+1) ;
for i:=0 to 255 do //とりあえず各色のカウンターを0にする
ColCountB[i]:=0;
for i:=0 to (ColACount-1) do begin
k:=ColA[i].Col;
ColB[k][ColCountB[k]]:=ColA[i] ; //代入
ColCountB[k]:=ColCountB[k]+1 ;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Randomize;
SetCol;
Label1.Caption := IntToStr(ColB[ColA[0].Col][0].Col);
Label2.Caption := IntToStr(ColA[0].Col);
end;
CalACountの値はどうなっていますか?
Halbow 様 ありがとうございます。
昨日お休みになられたと思いまして返事が遅れてしまいました。すみません。
昨晩色々やっていたのですが、変数や配列の宣言に問題がありそうです。
基本的なことだと思います。
Halbow様のソースコードを参考にして解決しようと思います。
本当に長い間ありがとうございました。
HOta 様 朝早くからありがとうございます。
>CalACountの値はどうなっていますか?
40000くらいです。
ツイート | ![]() |