動的な多次元配列をつくるには?

[戻る]
くるみ 2001/04/05(木) 10:22:07
初めて、質問させてもらいます。

わたしは、今、多次元の配列を使うプログラムを
作っているんですが、例えば、

int A[5][6];

のように、[]の中身を「5」とか「6」とかに
決めちゃって、宣言すると、
「ホントはもっとおっきい配列([10][20])
 が必要だよ」
となったときに、困ってしまいます。

だから、例えば、

int A[n][m];

みたいな感じで、nが1増えると、その配列の列数も
1増える、のような配列を作りたいです。

そこで、いろいろ調べてみたんですが、
「CArray」とゆうクラス(?)があって、
それを使って

CArray<int,int> A;

とゆう配列を定義できたのですが、
これを「二次元配列にしたいなー。」
となったとき、
CArray型で二次元配列を作る方法が、わからないくって
困っています。

もし、

「列数・行数を可変にできる"多次元配列"」

を作れる方法を知ってる方、いらっしゃいましたら、
どうか教えてください。

VC(とゆうより、プログラム自体)初心者で、
わからないことがいっぱいです…。

よろしくお願いします。

[E-Mail] 2001/04/05(木) 16:48:21
> 「列数・行数を可変にできる"多次元配列"」
聞いたこと無いですね。

ポインタ変数のポインタを使えばそれらしいことが出来ると思います。

ten_bun [E-Mail] 2001/04/05(木) 18:41:10
CArray < CArray<int,int>*,CArray<int,int>* > Sample_000;
int i,io_Size;

printf("\n");

for(i=0;i<10;i++){
   Sample_000.Add(new CArray<int,int>);
   for(int k=0;k<10;k++) Sample_000[i]->Add(k+i);        
}
io_Size = Sample_000.GetSize();
for(i=0;i<io_Size;i++) printf("\nSample_000[%d][%d] = %d",i,i,(*Sample_000[i])[i]);

io_Size = Sample_000.GetSize();
for(i=0;i<io_Size;i++) delete Sample_000[i];

CArrayを使った動的二次元配列っぽいけど
(*Sample_000[i])[i]でint要素にアクセスするのが気持ち悪い
と言えなくも無い。また、場合によってCArray<int,int>の実体を
解放しなければならないし・・・
CArraytテンプレートクラス内でARG_TYPEとARG_TYPE&引数
を持つオーバーロード関数が定義されていればもっと汎用性
が高くなりそうだが。STLのvectorを使ってみた場合も
検討してみる必要があるかも。

くるみ 2001/04/06(金) 09:56:10
[[解決]]
重さん、ten_bunさん、お返事ありがとうございます。

>> 「列数・行数を可変にできる"多次元配列"」
>聞いたこと無いですね。

う〜〜〜ん…。そうか。
簡単に、動的な二次元配列を定義することは
できないんですね。

>ポインタ変数のポインタを使えばそれらしいことが出来ると思います

ポインタのポインタについては、もっと勉強する必要が
もっと勉強する必要があるなー…。


ten_bunさんの方法でやってみると、
確かに可変な二次元配列ができました。

 Sample_000[0]〜Sample_000[i]

までの、i+1個の一次元配列ができて、
それぞれに、1〜k+1までのk個の整数を入れていく、
とゆうことと思っていいんですよね ? 

ちなみに、vectorも試したんですが、ビルド時にエラーが起こり、
「再定義されてます」のようなメッセージがでて、
結局時間がなくってまだ実行にいたってません(汗)。


可変長じゃなきゃ、

int a[3][5];

って間単にできるのにな〜。
可変長にするには工夫が必要なんだな〜。

でも、重さんとten_bunさんのおかげで、可変長の二次元配列を
定義する方法が(なんとなくだけど)わかりました(ような)。

本当に、ありがとうございました。
              
                  o(゜ε゜)o

古いスレッドには追加発言できません。