RE:A C++ problem

Masaharu Goto (MXJ02154@nifty.ne.jp)
Sun, 19 Jul 1998 21:37:00 +0900


Xie,

I modified your code as follows. This code should work fine.

------------------------------------------------------------------------
#include <stdio.h>
#include <iostream.h>

main()
{
//float **a = new (float*)[100];
float **a = new float*[10];
for(int i=0;i<10;i++) {
a[i] = new float[10];
for(int j=0;j<10;j++)
{
cout<<"-----------------"<<i<<"and"<<j<<"\n";
//a[i][j] = float(i*j);
a[i][j] = float(i*j);
cout<<"a[i][j] = "<<a[i][j]<<"\n";
}
}

for(int i=9;i>=0;i--) {
delete[] a[i];
}
//delete a; // Can I delete **a like this ??
delete[] a; // You should do it like this
}
--------------------------------------------------------------------------

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();
}