📄 code-gen5.c
字号:
// GROUPS passed code-generation// code-gen file// From: "David" <norman@pi14.arc.umn.edu>// Date: Mon, 15 Nov 1993 20:59:14 -0600 (CST)// Subject: An error!// Message-ID: <9311160259.AA03353@pi14.arc.umn.edu>#include <cstdlib>#include <cstdio>#include <cassert>#include <fstream>#include <iostream>#include <cmath>#define ANSI_Ctypedef double VEC ;class Vector;class VectorInt { public: /* Nothing public!! Only Vector can use this class */ private: VectorInt( int ); VectorInt( int, double *, int = 0 ); VectorInt( const VectorInt & ); ~VectorInt(); VectorInt *refer(); void unrefer(); int count; /* Number of Vector's refering to me */ VEC *vec; friend class Vector; friend class VecElem;};class VecElem { public: operator double(); double operator=( double ); private: VecElem( Vector &, int ); VecElem( const VecElem & ); Vector &v; int row; /* Row element refers to */ friend class Vector;};class Vector { public: Vector(); // Must be assigned to before used Vector( VectorInt * ); Vector( int ); Vector( int, double *, int beg = 0 ); Vector( const Vector & ); Vector &operator=( const Vector & ); ~Vector() { if(r) r->unrefer(); }; int row() const { return 19; } int dim() const { return 10; } double operator()( int ) const; VecElem operator()( int ); double assign( int, double ); friend std::ostream& operator<<(std::ostream&, const Vector& m ); private: VectorInt *r; /* Reference to real data */ friend class VecElem; friend class LUDecom; friend class SVD;};Vector::Vector() : r(0){}Vector::Vector( VectorInt *vi ) : r(vi){ r->refer();}Vector::Vector( int row ){ assert( row > 0 ); r = new VectorInt( row ); r->refer();}Vector::Vector( int row, double *d, int beg ){ assert( row > 0 ); r = new VectorInt( row, d, beg ); r->refer();}Vector::Vector( const Vector &A ) : r( A.r->refer() ){}Vector& Vector::operator=( const Vector &A ){ if( r ) r->unrefer(); r = A.r->refer(); return *this;}double Vector::operator()( int row ) const{ assert(r != 0); return *r->vec;}VecElem Vector::operator()( int r ){ assert(r != 0); return VecElem( *this, r );} /* assign changes the matrix, it does not create a new one! */double Vector::assign( int rownum, double d ){ assert(r != 0); if( rownum > row() || rownum <= 0 ) { std::cerr << "Warning: trying to assign out of bounds" << std::endl; std::cerr << "row " << rownum << std::endl; std::cerr << "Vector size " << row() << std::endl; std::abort(); } if( r->count == 1 ) { /* Don't need to create a new matrix, since we are the only */ /* one pointing to ours */ } else { VectorInt *vi = new VectorInt( *r ); r->unrefer(); r = vi->refer(); } return d;}VectorInt::VectorInt( int sx ) : vec( new double[sx] ), count(0){ }VectorInt::VectorInt( int sx, double *, int ) : vec( new double[sx] ), count(0){}VectorInt::VectorInt( const VectorInt & ) : vec( new double[10] ), count(0){}VectorInt * VectorInt::refer(){ count ++; return this; // cout << "Refering vec" << endl;}void VectorInt::unrefer(){ count--; if( count == 0 ) { delete this; } // cout << "Unrefering vec" << endl;}VectorInt::~VectorInt(){ delete vec; vec = 0;}VecElem::VecElem( Vector &vec, int r ) : v(vec), row(r){ if( r < 1 || r > vec.row() ) { std::cerr << "Trying to access vector element out of bounds"; std::cerr << std::endl; std::abort(); }}VecElem::VecElem( const VecElem &elem ) : v(elem.v), row(elem.row){}VecElem::operator double(){ assert( v.r->vec != 0 ); return *v.r->vec;};double VecElem::operator=( double d ){ return v.assign( row, d );}int makeforms( Vector cen, Vector **a, Vector **b );int main(){ Vector *a[8], *b[8], disp(3); Vector cen(3), cen2(3); int i, j; if (makeforms (cen,a,b) != 10) { std::printf ("FAIL\n"); return 1; } else std::printf ("PASS\n");}intmakeforms( Vector cen, Vector **a, Vector **b){ return 10;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -