お世話になっております。
ポインタの2次元配列について助言を頂きたいです(C++初心者です)。
現在、画像ファイルの読み取りのプログラムに取り組んでおります。
具体的には、縦のサイズ、横のサイズ、各ピクセルのRGBが並んでいるファイルです。
読み込む画像が毎回異なるため、動的に割り当てる必要があります。
ピクセルについては、クラスを作成しているため(ex. pixelClass)、縦横の2次元の配列の中にpixelClassのオブジェクトを使おうと考えておりますが、この場合、ポインタはpixelClass** で new pixelClass* なのか、int ** で new int*を使うのか、わかりません。
よろしくお願いいたします。
ポインタの2次元配列について
Re: ポインタの2次元配列について
ピクセルのデータを扱うクラスがあるのなら,そのpixelClass型の要素が画像サイズ分だけ必要という話なのでしょうから,
そこにint**とかが候補として出てくる理由が謎です.
pixelClass** にして,「2次元配列」な形態(?)にこだわっても良いでしょうが,個人的には確保と解放が面倒なだけに思います.
画像のサイズW,Hをファイルから読み取った時点で,W*H個の要素を作れば良いのだから, とかで良いのではないでしょうか.これなら確保と解放が楽です.要素アクセスは とすれば良いです.
毎度y*W+xとか書きたくないでしょうから,↓のように,画素アクセス手段を提供「画像クラス」でも作れば良いでしょう.メモリ管理も中に閉じ込められますし.
そこにint**とかが候補として出てくる理由が謎です.
pixelClass** にして,「2次元配列」な形態(?)にこだわっても良いでしょうが,個人的には確保と解放が面倒なだけに思います.
画像のサイズW,Hをファイルから読み取った時点で,W*H個の要素を作れば良いのだから, とかで良いのではないでしょうか.これなら確保と解放が楽です.要素アクセスは とすれば良いです.
毎度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とか使えばどうの…的な話はとりあえず置いておく)