Re: vvector test program

Fons Rademakers (Fons.Rademakers@cern.ch)
Wed, 14 Jan 1998 15:53:57 +0100


Hi Paolo,

what is happening here is legal C++ (hence a Solaris C++ bug),
albeit a little tricky (category obfuscated C++):

TMatrix m(2,2);
(TMatrixDiag)m = pattern-3;

creates a temporary TMatrixDiag object initializes it with m
(using TMatrixDiag(const TMatrix &) and applies to the resulting
temporary the void TMatrixDiag::operator=(Real_t val) to make
the assignement to the diagonal of m. Since a TMatrixDiag works
directly on a reference of m we don't mind losing the handle to
the diagonal matrix.

To make it compile on Solaris make the following changes:

cout << "\nCheck modifying the matrix diagonal" << endl;
m = pattern;
//(TMatrixDiag)m = pattern-3;
TMatrixDiag td = m; <----- here
td = pattern-3; <----- here
Assert( !( m == pattern ) && !( m != pattern ) );
vc = TMatrixDiag(m);
verify_element_value(vc,pattern-3);
//TMatrixDiag(m) += 3;
td += 3; <----- here
Assert( m == pattern );
vc = pattern+3;
//(TMatrixDiag)m = vc;
td = vc; <------ here
Assert( !( m == pattern ) && !( m != pattern ) );

I'll change the example so it will also compile on Solaris.

Cheers, Fons.


Paolo CALAFIURA wrote:
>
> Hi everybody,
> in the test program vvector.cxx that I found in 1.03 distribution I
> read:
> const Real_t pattern = 8.625;
> TMatrix m(0,vsize,0,vsize+1);
> ...
> m = pattern;
> (TMatrixDiag)m = pattern-3; //line 459
>
> I am used to be baffled by elegant C++ constructs, but this time the
> Solaris compiler is not any better than me:
> > na48s01:/afs/cern.ch/user/c/calaf/root/test>gmake
> > CC -O -KPIC -I/afs/cern.ch/user/c/calaf/root/include -c vvector.cxx
> > "vvector.cxx", line 459: Error: The left operand must be a lvalue.
> > "vvector.cxx", line 466: Error: The left operand must be a lvalue.
> > "vvector.cxx", line 494: Error: The left operand must be a lvalue.
> > 3 Error(s) detected.
>
> Where is the trick?
>
> Paolo Calafiura

-- 
Org:    CERN, European Laboratory for Particle Physics.
Mail:   1211 Geneve 23, Switzerland          Phone: +41 22 7679248
E-Mail: Fons.Rademakers@cern.ch              Fax:   +41 22 7677910