ポインタの2次元配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
hisa

ポインタの2次元配列について

#1

投稿記事 by hisa » 4年前

お世話になっております。
ポインタの2次元配列について助言を頂きたいです(C++初心者です)。
現在、画像ファイルの読み取りのプログラムに取り組んでおります。
具体的には、縦のサイズ、横のサイズ、各ピクセルのRGBが並んでいるファイルです。
読み込む画像が毎回異なるため、動的に割り当てる必要があります。
ピクセルについては、クラスを作成しているため(ex. pixelClass)、縦横の2次元の配列の中にpixelClassのオブジェクトを使おうと考えておりますが、この場合、ポインタはpixelClass** で new pixelClass* なのか、int ** で new int*を使うのか、わかりません。

よろしくお願いいたします。

アバター
usao
記事: 1887
登録日時: 11年前

Re: ポインタの2次元配列について

#2

投稿記事 by usao » 4年前

ピクセルのデータを扱うクラスがあるのなら,そのpixelClass型の要素が画像サイズ分だけ必要という話なのでしょうから,
そこにint**とかが候補として出てくる理由が謎です.

pixelClass** にして,「2次元配列」な形態(?)にこだわっても良いでしょうが,個人的には確保と解放が面倒なだけに思います.

画像のサイズW,Hをファイルから読み取った時点で,W*H個の要素を作れば良いのだから,

コード:

pixelClass *ImgPixels = new pixelClass[ W*H ];  //「1次元」ですが
とかで良いのではないでしょうか.これなら確保と解放が楽です.要素アクセスは

コード:

//座標(x,y)の要素
ImgPixels[ y*W + x ];
とすれば良いです.
毎度y*W+xとか書きたくないでしょうから,↓のように,画素アクセス手段を提供「画像クラス」でも作れば良いでしょう.メモリ管理も中に閉じ込められますし.

コード:

class MyImg
{
public:
  //画素データへのアクセス手段.
  //座標(x,y)の画素への参照を返す.
  //※m_ImgW,m_ImgHを用いて領域外参照のチェックをするとかしても良いかと
  pixelClass &At( int x, int y ){  return m_ImgPixels[y*m_ImgW + x];  }
  const pixelClass &At( int x, int y ) const {  return m_ImgPixels[ y*m_ImgW + x ];  }
  
private:
  int m_ImgW;  //画像サイズ(幅)
  int m_ImgH;  //画像サイズ(高さ)
  pixelClass *m_ImgPixels;  //画素データ群
};
オフトピック
(std::vectorとか使えばどうの…的な話はとりあえず置いておく)

hisa

Re: ポインタの2次元配列について

#3

投稿記事 by hisa » 4年前

usaoさま

分かりやすいご回答ありがとうございます。
早速試してみます。

返信

“C言語何でも質問掲示板” へ戻る