本来,ネイティブの配列の使用は極力控えstd::vectorもしくはstd::tr1::arrayなどのより有用なコンテナを使用するべきであるが,既存のライブラリを用いる場合にネイティブ配列が必要となる場合がある.
一次元配列とポインタは同等であるが,二次元配列とダブルポインタは同等ではない.
二次元→一次元
一次元→二次元
下に示すコードは上記変換を行うテンプレート関数である.二次元化するときの列サイズはコンパイル時に決まっている必要がある.
なお,安全性は全くない.ネイティブの配列はサイズ情報が存在しないから当然である.
また,二次元化するくらいなら,一次元に対して col_size * row + col もしくは row_size * col + row でアクセスするべきであろう.
一次元配列とポインタは同等であるが,二次元配列とダブルポインタは同等ではない.
二次元→一次元
int x[10][10]; int *p = x[0];
一次元→二次元
int x[100]; int (*p)[10] = (int (*)[10]) x; // int p[10][10] int (*p2)[20] = (int (*)[20]) x; // int p2[5][20]
下に示すコードは上記変換を行うテンプレート関数である.二次元化するときの列サイズはコンパイル時に決まっている必要がある.
なお,安全性は全くない.ネイティブの配列はサイズ情報が存在しないから当然である.
また,二次元化するくらいなら,一次元に対して col_size * row + col もしくは row_size * col + row でアクセスするべきであろう.
template <size_t COL, class T> struct array_type { typename T (*value)[COL]; }; template <size_t COL, class T> typename array_type<COL, T> array_ptr_cast(T* p) { array_type<COL, T> rst; rst.value = reinterpret_cast< T (*)[COL] >(p); return rst; } template <size_t COL, class T> typename T* array_ptr_cast(T (*p)[COL]) { return reinterpret_cast< T* >(p); }
コメントをかく