配列間のコピー

解決


hairetu  2003-12-28 07:18:26  No: 6437

一次元動的配列を二次元動的配列にコピーしたいのですが、全くわかりません。どなたか簡単なサンプルを書き込んで頂けないでしょうか?よろしくお願いします。


Halbow  2003-12-28 07:25:36  No: 6438

Halbow です。

> 一次元動的配列を二次元動的配列にコピーしたいのですが、全くわかりません。

一次元動的配列を二次元動的配列にコピーする仕方は一通りではありません。
どのようにしたいのか分からないと回答のしようがありません。
コピーなら、たんにやりたいように代入するといいのではないでしょうか。


hairetu  2003-12-28 07:46:20  No: 6439

Halbow 様  ありがとうございます。
単にコピーしたものをコンパイル後実行してみると、
コピーされた方の値をテキストBOXに表示するようにしているのですが、その部分で落ちます。で、落ちたソース部分にマウスカソールを近づけると配列名=()となっていて配列の中身が空になっています。さらに参照できない値となっています。なお配列は構造体です。


Halbow  2003-12-28 08:10:09  No: 6440

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;


hairetu  2003-12-28 09:00:29  No: 6441

初心者で恥ずかしいのですが以下のような感じです。
たとえば一次元配列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;


hairetu  2003-12-28 09:12:51  No: 6442

記入忘れがありました

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  2003-12-28 09:26:59  No: 6443

Halbow です。

配列の定義部分がありませんので全体が分かりません。


Mr.XRAY  URL  2003-12-28 09:36:08  No: 6444

ちょっと一言.

>コピーされた方の値をテキストBOXに表示するようにしているのですが、そ

このコピーがうまくいっていなのでしょうね.

>の部分で落ちます。で、落ちたソース部分にマウスカソールを近づけると配

この落ちるという,抽象的な表現ではわかりづらいですね.
具体的に何か表示されないのですか.


Halbow  2003-12-28 09:41:54  No: 6445

Halbow です。

> この落ちるという,抽象的な表現ではわかりづらいですね.

たぶん、SetLength() で確保した以上のインデックスにアクセスしているのでしょう。
ですから、配列の定義と長さの確保の状態が分からないとなんとも言えないですね。


hairetu  2003-12-28 10:08:09  No: 6446

実際のコードはかなり長いので注目している部分を抽出して書きます。
色々やってみたのですがどうも代入の方法が悪いのではなくて、
配列の宣言等が悪用に感じます。
下記’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;


hairetu  2003-12-28 10:26:59  No: 6447

> この落ちるという,抽象的な表現ではわかりづらいですね

具体的にはエラーメッセージ "デバッガ例外が発生"(プロジェクト△△△.exeがERangErrorクラスの例外を生成しました。’範囲チェックエラー’プロセスは停止しています。再開するにはステップ実行または実行を選択してください。)が表示されます。


Halbow  2003-12-28 10:59:55  No: 6448

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 のようになるはずです。


hairetu  2003-12-28 11:28:05  No: 6449

申し訳ありません。

>ColA : array of TTMyCol ;

の部分は  TTMyCol : TMyCol ;です。
一次元配列です。

下記の部分で配列の領域を確保できていないです。
    for i:=0 to 255 do
          SetLength(ColB[i], ColCountB[i]+1)


hairetu  2003-12-28 11:29:55  No: 6450

間違えました。

ColA : TMyCol ;です。


Halbow  2003-12-28 11:33:55  No: 6451

Halbow です。

> ColA : TMyCol ;です。

じゃなくて

 ColA:TTMyCol;

じゃないですか?なんだか、わけがわからなくなってきました。もう寝ます。


Halbow  2003-12-28 12:08:11  No: 6452

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;


HOta  2003-12-28 17:38:22  No: 6453

CalACountの値はどうなっていますか?


hairetu  2003-12-28 21:12:36  No: 6454

Halbow 様  ありがとうございます。
昨日お休みになられたと思いまして返事が遅れてしまいました。すみません。
昨晩色々やっていたのですが、変数や配列の宣言に問題がありそうです。
基本的なことだと思います。

Halbow様のソースコードを参考にして解決しようと思います。
本当に長い間ありがとうございました。

HOta  様  朝早くからありがとうございます。

>CalACountの値はどうなっていますか?
40000くらいです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加