#include <iostream>
#ifdef __BORLANDC__
#else
  using namespace std;
#endif

class Tab
  {
   protected:
   unsigned R;
   double *T;
   public:
   Tab(unsigned NewR=0):R(NewR),T(R?new double[R]:0) {}
   Tab(const Tab &Tb);
   ~Tab() { if(R) delete[] T; }
   Tab &operator=(const Tab &Tb);
   const double &operator[](unsigned i)const;
   double &operator[](unsigned i);
   unsigned operator()()const { return(R); }
   void operator()(unsigned NewR);
  };

Tab::Tab(const Tab &Tb):R(Tb.R),T(R?new double[R]:0)
  {
   memcpy(T,Tb.T,R*sizeof(double));
  }

Tab &Tab::operator=(const Tab &Tb)
  {
   if(R!=Tb.R)
     {
      if(R) delete[] T;
      R=Tb.R;
      T=R?new double[R]:0;
     }
   memcpy(T,Tb.T,R*sizeof(double));
   return(*this);
  }

const double &Tab::operator[](unsigned i)const
  {
   if(i>=R) throw i;
   return(T[i]);
  }

double &Tab::operator[](unsigned i)
  {
   if(i>=R) throw i;
   return(T[i]);
  }

void Tab::operator()(unsigned NewR)
  {
   double *NewT=NewR?new double[NewR]:0;
   if(R)
     {
      memcpy(NewT,T,(R<NewR?R:NewR)*sizeof(double));
      delete[] T;
     }
   T=NewT;
   R=NewR;
  }

ostream &operator<<(ostream &s,const Tab &Tb)
  {
   s<<'{';
   for(unsigned i=0;i<Tb();++i)
     {
      if(i) s<<',';
      s<<Tb[i];
     }
   return(s<<'}');
  }                                                                                                                                                                //double TabIni::NowaWartosc=*((double*)"\0\0\0\0\0\0\xF8\x7F");

class TabIni:public Tab
  {
   private:
   static double NowaWartosc;
   public:
   TabIni(unsigned NewR=0);
   TabIni(const TabIni &Tb):Tab(Tb) {}
   TabIni &operator=(const TabIni &Tb) { Tab::operator=(Tb); return(*this); }
   unsigned operator()()const { return(R); }
   void operator()(unsigned NewR);
   static double Nw() { return(NowaWartosc); }
   static void Nw(double n) { NowaWartosc=n; }
  };
double TabIni::NowaWartosc=*((double*)"\0\0\0\0\0\0\xF0\xFF");
//double TabIni::NowaWartosc=*((double*)"\0\0\0\0\0\0\xF0\x7F");
//double TabIni::NowaWartosc=*((double*)"\0\0\0\0\0\0\xF8\xFF");
//double TabIni::NowaWartosc=*((double*)"\0\0\0\0\0\0\xF8\x7F");

TabIni::TabIni(unsigned NewR):Tab(NewR)
  {
   for(unsigned i=0;i<R;++i) T[i]=NowaWartosc;
  }

void TabIni::operator()(unsigned NewR)
  {
   unsigned i=R;
   Tab::operator()(NewR);
   while(i<R) T[i++]=NowaWartosc;
  }


int main()
  {
   TabIni::Nw(0);
   
   int N=8;

char *tmp=new char[2000];
memset(tmp,3,2000);
delete[] tmp;

   TabIni T(N);
   cout<<"T="<<T<<endl;
   for(unsigned i=0;i<T();++i) T[i]=10-i;
   cout<<"T="<<T<<endl;
   TabIni A=T;
   A[2]=0;
   T=A;
   A(N*2);
   cout<<"A="<<A<<endl;
   double x=TabIni::Nw();
   T(0);
   T.Nw(2);        T(3);
   A.Nw(3);        T(6);
   TabIni::Nw(4);  T(9);
   cout<<"T="<<T<<endl;
   TabIni::Nw(x);
   T(0);
   T(5);
   cout<<"T="<<T<<endl;

#ifdef __CONSOLE__
   cin.get();
#endif
   return(0);
  }
