⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 barray.cpp

📁 Adaptive digital Filters in C++
💻 CPP
字号:
// barray.cpp	Implementation of bare Float,Double or Complex Array class

#include <barray.hpp>

static const char rcsid[] = "@(#)barray.c++	1.15 15:31:29 4/19/94   EFC";

// #define DEBUG
// #define DEBUG_RESIZE

#ifdef DEBUG
// #include <debug.hpp>
#include <traceback.hpp>

// extern Debug debug;

#endif

#ifdef __TURBOC__
#include <signal.h>
#include <float.h>

static void handler(int sig)
{
#ifdef DEBUG
	cerr << "error handler, signal = " << sig << '\n';
#endif

	// clear the error
	_fpreset();
	
	signal(SIGFPE, handler);
	
}

#endif

BasicArray::BasicArray() : n(sze), sze(1), wdth(1), rsize(1)
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::BasicArray()");
#endif
	x = new scalar_type[ 1 ];

}

BasicArray::BasicArray(const int ni) : n(sze), sze(ni), wdth(ni+1), rsize(ni)
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::BasicArray(int)");
	tb << "n = " << n << endl;
#endif
	x = new scalar_type[ n ];

}

BasicArray::BasicArray(const BasicArray& f2) : n(sze)
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::BasicArray(BasicArray&)");
#endif
	rsize = sze = f2.size();
	wdth = f2.wdth;
	
	x = new scalar_type[rsize];

	for (int k = 0; k < rsize; k++)
		x[k] = f2.x[k];

}

BasicArray::~BasicArray()
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::~BasicArray()");
#endif
#ifdef __ZTC__
		if ( x ) delete [n]x;
#else
	        if ( x ) delete []x;
#endif

		x = NULL;
		rsize = sze = 0;                 
}

BasicArray& BasicArray::operator = (const BasicArray& f2)
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::operator=(BasicArray)");
#endif
	if ( this == &f2 )
		return *this;

	if ( x != NULL && rsize != f2.size() )
	{
#ifdef __ZTC__
		delete [n]x;
#else                        
		delete []x;
#endif

		rsize = f2.size();
		x = new scalar_type[rsize];
	}

	sze = rsize;
	// wdth = f2.wdth;


	for (int k = 0; k < rsize; k++)
		x[k] = f2.x[k];

	return *this;	
}

void BasicArray::trim(const int nsize)	// make the array SEEM to be smaller
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::trim()" );
	tb << "BasicArray::trim( " << nsize << " ), trimming from " << sze;
	tb << " , rsize = " << rsize << '\n';
#endif
	if ( nsize >= 0 && nsize <= rsize )
		sze = nsize;
}

void BasicArray::reset(const scalar_type val)
{
#ifdef DEBUG
	TraceBack tb( "BasicArray::reset(scalar assignment)" );
	tb << "sze = " << sze << endl;
#endif
	for (int k = 0; k <sze; k++)
        		x[k] = val;
}

void BasicArray::resize(const int nsize)
{
#ifdef DEBUG_RESIZE
	TraceBack tb( "BasicArray::rsize()" );
	tb << "nsize = " << nsize << "  sze = " << sze << "  rsize = " << rsize
	   << endl;
	tb << "*x = " << x << endl;
#endif
	 int k, kend;

	sze = nsize;

	if ( nsize == rsize )
		return;			// nothing to do

	 kend = rsize;

	  if ( nsize < kend )			// keep the smaller size
			kend = nsize;

	  scalar_type *xn = new scalar_type[ nsize ];

	  if ( x )
	  {
	 	 // copy the old data
	 	 for (k = 0; k < kend; k++)
				xn[k] = x[k];

#ifdef __ZTC__
	  	delete [kend]x;
#else          
	  	delete []x;
#endif
	  }
	  else
		for (k = 0; k < nsize; k++)
				xn[k] = 0.0;

	  rsize = nsize;
	  x = xn;

	  wdth = rsize + 1;
}

int BasicArray::write(ofstream &ofs, int count,const int first) const
{
	if ( count < 0 )
		count = sze - first;

	if ( count <= 0 )
		return -1;

	ofs.write( (char *)&(x[first]), count * sizeof( scalar_type ) );

	if ( ofs.fail() )
		return -1;
	else
		return 0;
 
}

int BasicArray::read(ifstream &ifs, int count,const int first)
{

	if ( count < 0 )
		count = sze;

	if ( (first + count) > sze )
		resize( first+count );

 
	ifs.read( (char *)&(x[first]), count * sizeof( scalar_type ) );


	if ( ifs.fail() )
		return -1;
	else
		return 0;

}

istream& operator>> (istream& is, BasicArray& arry)
{
	scalar_type new_x;
	int k, kend;

#ifdef __TURBOC__
	static int first = 1;

	
	if ( first )
	{
		signal( SIGFPE, handler );
		first = 0;
	}
#endif

	if ( is.eof() )
		return is;


	kend = arry.size();

	for (k = 0; k < kend; k++)
	{		
		is >> new_x;
		

 		// end of file reached, abort the read
		if ( is.eof() || is.fail() )
			return is;

		arry[k] = new_x;		
	}
	
	return is;
	
}

ostream& operator<< (ostream& os,const BasicArray& arry)
{
	int iend = arry.size();

	for (int i = 0; i < iend;  )
	{
		os << arry[i];
		if ( (++i % arry.wdth) == 0 )
				os << '\n';
		else
				os << "   "; 
	}

//	if ( (i % arry.wdth) != 0 )	os << '\n';
	
	return os;
	
}


int operator!=(const BasicArray &a,const BasicArray &b) //      int i = (a != b)
{
        if ( a.size() != b.size() )
                return 1;

        const int sz = a.size();
        int l = 1;

        for (int i = 0; i < sz; i++)
                        l = l && ( a[i] != b[i] );

        return l;

}

int operator==(const BasicArray &a,const BasicArray &b) //      int i = (a == b)
{
        if ( a.size() != b.size() )
                return 0;

        const int sz = a.size();
        int l = 1;

        for (int i = 0; i < sz; i++)
                        l = l && ( a[i] == b[i] );

        return l;

}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -