Hi Christian, On Thu, 4 Jan 2001 cstrato@EUnet.at wrote: > Dear Rene > > Thank you very much for answering my questions. Since you said, you do not > understand my second question regarding TMatrix without having a working example, > I have implemented a "TestClass" which I compile as library "TestClass.so" > and use in macro "MacroTestClass.C. > Below I have attached all necessary files. > > When I write a simple macro (see TestMacro.C below), all works fine, but > when I put the same code in a member function I cannot compile the library. > However, when I put TMatrix on the stack and comment out the TString code, > everything works fine. > > I have the following questions: > > 1, Why can I not use vMatrix(i,j) when TMatrix is created on the heap? > I get the following error when compiling TestClass: That is the way the operator () is defined. Do: TMatrix *vM = new TMatrix(vNRows,vNCols); TMatrix &vMatrix = *vM; > > [christian@cookiebook rootcode]$ gmake -f Makefile4TestClass > g++ -O -Wall -fPIC -fsigned-char -I/usr/X11/include -I/opt/root/include -c TestClass.cxx > TestClass.cxx: In method `void TestClass::FTest2(int, int)': > TestClass.cxx:59: `vMatrix' cannot be used as a function > TestClass.cxx:62: `vMatrix' cannot be used as a function > TestClass.cxx:63: `vMatrix' cannot be used as a function > gmake: *** [TestClass.o] Error 1 > > 2, Why can I not append a number to TString? > I get the following error when compiling TestClass: > This problem was fixed in TString two weeks ago. You can import the current CVS version. Rene Brun > [christian@cookiebook rootcode]$ gmake -f Makefile4TestClass > g++ -O -Wall -fPIC -fsigned-char -I/usr/X11/include -I/opt/root/include -c TestClass.cxx > TestClass.cxx: In method `void TestClass::FTest1(const char *)': > TestClass.cxx:40: ambiguous overload for `TString & += Int_t &' > /opt/root/include/TString.h:384: candidates are: class TString & TString::operator +=(const > TString &) > /opt/root/include/TString.h:387: class TString & TString::operator +=(char) > > /opt/root/include/TString.h:390: class TString & TString::operator +=(long > int) > /opt/root/include/TString.h:393: class TString & TString::operator +=(long > unsigned int) > gmake: *** [TestClass.o] Error 1 > > Thank you once again for your help. > > Best regards > Christian Stratowa > Vienna, Austria > > My system: PowerBook running LinuxPPC 2000 > root 3.00/00 19 December 2000 > > //-------------------------------------- > // TestMacro.C > //-------------------------------------- > { > // test: append to string > TString s = "Test"; > for (Int_t i=0;i<4;i++) { > s = "Test"; > s+=i; > s+="."; > cout << s << endl; > } > > Int_t vNRows = 3; > Int_t vNCols = 4; > // test: matrix on heap > TMatrix *vMatrix1 = new TMatrix(vNRows,vNCols); > for (Int_t i=0;i<vNRows;i++) { > for (Int_t j=0;j<vNCols;j++) { > vMatrix1(i,j) = i + j; > } > } > cout << "Matrix1(0,0) = " << vMatrix1(0,0) << endl; > cout << "Matrix1(NRows-1,NCols-1) = " << vMatrix1(vNRows-1,vNCols-1) << endl; > delete vMatrix1; > > // test: matrix on stack > TMatrix vMatrix2(vNRows,vNCols); > for (Int_t i=0;i<vNRows;i++) { > for (Int_t j=0;j<vNCols;j++) { > vMatrix2(i,j) = i + j; > } > } > cout << "Matrix2(0,0) = " << vMatrix2(0,0) << endl; > cout << "Matrix2(NRows-1,NCols-1) = " << vMatrix2(vNRows-1,vNCols-1) << endl; > }//macro > > > //-------------------------------------- > // MacroTestClass.C > //-------------------------------------- > { > gROOT->Reset(); > gSystem->Load("/opt/rootcode/TestClass.so"); > > TestClass *vTestClass = new TestClass("Test",1.2,1,2,3); > > vTestClass->FTest1("Test"); > vTestClass->FTest2(3,4); > > delete vTestClass; > }//macro > > > //-------------------------------------- > // TestClass.h > //-------------------------------------- > #ifndef __TestClass__ > #define __TestClass__ > > #include <iostream.h> > #include "TObject.h" > #include "TString.h" > > class TestClass: public TObject { > > private: > TString fText; > Float_t fFloat; > Int_t fInt; > Int_t fX; > Int_t fY; > > public : > > TestClass(); > TestClass(TString vText, Float_t vFloat, Int_t vInt, Int_t x, Int_t y); > ~TestClass(); > > void FTest1(const char *vText); > void FTest2(Int_t vNRows,Int_t vNCols); > > void FSetFloat(Float_t vFloat) {fFloat = vFloat;} > void FSetInt(Int_t vInt) {fInt = vInt;} > void FSetX(Int_t vX) {fX = vX;} > void FSetY(Int_t vY) {fY = vY;} > > Float_t FGetFloat() const {return fFloat;} > Int_t FGetInt() const {return fInt;} > Int_t FGetX() const {return fX;} > Int_t FGetY() const {return fY;} > > ClassDef(TestClass,1) //TestClass > }; > > #endif > > > //-------------------------------------- > // TestClass.cxx > //-------------------------------------- > #include "TestClass.h" > #include "TMatrix.h" > > ClassImp(TestClass); > > TestClass::TestClass(): TObject() > { > cout << "TestClass::TestClass" << endl; > } > > TestClass::TestClass(TString vText, Float_t vFloat, Int_t vInt, Int_t x, Int_t y): > TObject() > { > cout << "TestClass::TestClass" << endl; > > fText = vText; > fFloat = vFloat; > fInt = vInt; > fX = x; > fY = y; > }//Constructor > > TestClass::~TestClass() > { > cout << "~TestClass::TestClass" << endl; > }//Destructor > > void TestClass::FTest1(const char *vText) > { > cout << "TestClass::FTest1" << endl; > > // test: append to string > TString s = vText; > //* cannot compile > for (Int_t i=0;i<4;i++) { > s = "xxx"; > s+=i; > s+="."; > cout << s << endl; > }//for > //*/ > cout << "String = " << s << endl; > }//FTest1 > > void TestClass::FTest2(Int_t vNRows,Int_t vNCols) > { > cout << "TestClass::FTest2" << endl; > > // test: fill matrix > // TMatrix *vMatrix = new TMatrix(vNRows,vNCols); > TMatrix vMatrix(vNRows,vNCols); > > for (Int_t i=0;i<vNRows;i++) { > for (Int_t j=0;j<vNCols;j++) { > vMatrix(i,j) = i + j; > } > } > cout << "Matrix(0,0) = " << vMatrix(0,0) << endl; > cout << "Matrix(NRows-1,NCols-1) = " << vMatrix(vNRows-1,vNCols-1) << endl; > > // delete vMatrix; > }//FTest2 > > > //-------------------------------------- > // TestClassLinkDef.h > //-------------------------------------- > #ifdef __CINT__ > > #pragma link off all globals; > #pragma link off all classes; > #pragma link off all functions; > > #pragma link C++ class TestClass+; > > #endif > > > //-------------------------------------- > // Makefile4TestClass > //-------------------------------------- > # Makefile for class TestClass. > # shell: gmake -f Makefile4TestClass > > ARCH = linuxppcegcs > > CXX = > ObjSuf = o > SrcSuf = cxx > ExeSuf = > DllSuf = so > OutPutOpt = -o > > ROOTCFLAGS := $(shell root-config --cflags) > ROOTLIBS := $(shell root-config --libs) > ROOTGLIBS := $(shell root-config --glibs) > > > ifeq ($(ARCH),linuxegcs) > # Linux with egcs (>= RedHat 5.2) > CXX = g++ > CXXFLAGS = -O -Wall -fPIC > LD = g++ > LDFLAGS = -O > SOFLAGS = -shared > endif > > ifeq ($(ARCH),linuxppcegcs) > # MkLinux with egcs/glibc > CXX = g++ > CXXFLAGS = -O -Wall -fPIC > LD = g++ > LDFLAGS = -O > SOFLAGS = -shared -Wl,-soname, > endif > > > CXXFLAGS += $(ROOTCFLAGS) > LIBS = $(ROOTLIBS) $(SYSLIBS) > GLIBS = $(ROOTGLIBS) $(SYSLIBS) > > #------------------------------------------------------------------------------ > > TESTCLASSO = TestClass.$(ObjSuf) TestClassDict.$(ObjSuf) > TESTCLASSS = TestClass.$(SrcSuf) TestClassDict.$(SrcSuf) > TESTCLASSSO = TestClass.$(DllSuf) > > > OBJS = $(TESTCLASSO) > PROGRAMS = $(TESTCLASSSO) > > #------------------------------------------------------------------------------ > > .SUFFIXES: .$(SrcSuf) .$(ObjSuf) .$(DllSuf) > > all: $(PROGRAMS) > > $(TESTCLASSSO): $(TESTCLASSO) > $(LD) $(SOFLAGS) $(LDFLAGS) $^ $(OutPutOpt) $@ > > clean: > @rm -f $(OBJS) core > > .SUFFIXES: .$(SrcSuf) > > ### > > > TestClass.$(ObjSuf): TestClass.h > TestClassDict.$(SrcSuf): TestClass.h TestClassLinkDef.h > @echo "Generating dictionary TestClassDict..." > @rootcint -f TestClassDict.$(SrcSuf) -c TestClass.h TestClassLinkDef.h > > .$(SrcSuf).$(ObjSuf): > $(CXX) $(CXXFLAGS) -c $< > > #------------------------------------------- > > > Rene Brun wrote: > > > Hi Christian, > > > > > 3, Why can I not use vMatrix(x,y) when TMatrix is created on the heap? > > > > I do not understand this point without having a working example. > > > > Rene Brun > > >
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:33 MET