It looks like 2D/3D classes are FAQ item. Many people are still fighting with
raw pointer to make 2D/3D array which is very painful.
In theory, you can use STL 'vector<vector<vector<float> > >' for 3D, but
some compilers and also cint has problem dealing with such complex STL usage.
I made simple 2D/3D classes which are easier to deal with. If somebody else
have better solution, please follow,
Masaharu Goto
// vec3d.h ///////////////////////////////////////////////////////////
// You can precompile this module by following command
// $ makecint -mk Makefile -dl vec3d.dll -H vec3d.h
// $ make -f Makefile
//
// 2 dimentional array
template<class T> class array2d {
public:
array2d(int jx,int kx) {
maxj=jx; maxk=kx;
isnew=1;
p = new T[maxj*maxk];
}
array2d(T* pin,int jx,int kx) {
maxj=jx; maxk=kx;
isnew=0;
p = pin;
}
~array2d() {if(isnew) delete[] p;}
T& operator()(int i,int j,int k) {return( *(p + maxk*j + k) ) ;}
T* operator[](int j) {return(p+maxk*j);}
private:
T* p;
int maxj,maxk;
int isnew;
};
// 3 dimentional array
template<class T> class array3d {
public:
array3d(int ix,int jx,int kx) {
maxi=ix; maxj=jx; maxk=kx;
isnew=1;
p = new T[maxi*maxj*maxk];
}
array3d(T* pin,int ix,int jx,int kx) {
maxi=ix; maxj=jx; maxk=kx;
isnew=0;
p = pin;
}
~array3d() {if(isnew) delete[] p;}
T& operator()(int i,int j,int k) {
return( *(p + ((maxj*maxk)*i + maxk*j + k)) );
}
array2d<T> operator[](int i) {
array2d<T> tmp(p+maxj*maxk*i,maxj,maxk);
return(tmp);
}
private:
T* p;
int maxi,maxj,maxk;
int isnew;
};
typedef array3d<double> double3d;
typedef array2d<double> double2d;
typedef array3d<float> float3d;
typedef array2d<float> float2d;
typedef array3d<int> int3d;
typedef array2d<int> int2d;
/// END OF 2D/3D array classes ////////////////////////////////////////////
Below is an example of using array classes.
///////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#ifdef __CINT__
#include "vec3d.dll"
#else
#include "vec3d.h"
#endif
// Please use following notation for now
// This is more efficient.
test1() {
int i,j,k;
const int x=5, y=3,z=4;
float3d a(x,y,z);
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
for(k=0;k<z;k++) {
a(i,j,k) = i+j+k; // a(i,j,k) notation is faster
}
}
}
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
for(k=0;k<z;k++) {
printf("i=%d j=%d k=%d %g\n",i,j,k,a(i,j,k));
}
}
}
}
// Please don't use it as follows
// This is slightly inefficient and cint has bug now
test2() {
int i,j,k;
const int x=5, y=3,z=4;
float3d a(x,y,z);
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
for(k=0;k<z;k++) {
a[i][j][k] = i+j+k; // a[i][j][k] notation works, but a bit slower
}
}
}
for(i=0;i<x;i++) {
for(j=0;j<y;j++) {
for(k=0;k<z;k++) {
// following notation should work, but I found a bug in cint
// I need to fix it
printf("i=%d j=%d k=%d %g\n",i,j,k,a[i][j][k]);
}
}
}
}
main() {
test1();
//test2();
}