Hi On Tue, 4 Sep 2001 19:16:12 +0530 (IST) "B.V.L.S.Prasad" <shiva@mbu.iisc.ernet.in> wrote concerning "Re: Sorry - here you go (was Re: [ROOT] Advice for Good Programming : Part 2:)": > Hi christian, > I have tried and compiled the tar ball you have sent. I am using > makecint not root...I dont think it is a problem. I'm not using ROOT stuff in that makefile. I'm creating the dictionary using CINT - nothing else. I only used root-config to get the include path to G__ci.h, that's it. > I just used: > > makecint -mk makebio -o bio -H BioAtomLibrary.h BioAtomLibraryLinkDef.h -C++ > BioAtomLibrary.cxx > > then > make -f makebio > > These are my observations: > > First I compiled it on mandrake 8.0, gcc-2.96 (supposed to be > buggy), its not getting compiled...some problem. Do submit a bug report if it keeps saying you should do that. > Then I searched here and there for RedHat 6.2, and finally located > and did the same things. It got compiled and gave an interpretor > with name bio as desired. That's as far as I got too, expect that I made a shared lib, and loaded it into CINT with the .L command. > for checking it, I typed bio: and gave some commands like this to access the > data which is the primary purpose: > > bio> { > end with '}'> setAtomDefaults(); > end with '}'> cout<<Atom["Ca"].getAtomicNumber()<<endl; > end with '}'> } > Error: Can't call > map<string,BioAtomLibrary,less<string>,__malloc_alloc_template<0> > >::operator[]((char*)0x850e6b8) in current scope FILE:/tmp/filea2sIty_cint > LINE:3 > Possible candidates are... > filename line:size busy function type and name (in > map<string,BioAtomLibrary,less<string>,__malloc_alloc_template<0> >) > Error: non class,struct,union object Atom["Ca"] used with . or -> > FILE:/tmp/filea2sIty_cint LINE:3 > (class G__CINT_ENDL)136702840 > !!!Dictionary position rewinded... !!!Error recovered!!! > bio> I saw the same problem. My point was more to the actual compilation than the usage. > I even did, class BioAtomLibrary to check whether it is compiled or > not... it successfully gave the public member functions. > > why I am not able to use those 2 lines of code to access the data.. I have no idea - sorry. Try writting Masa and/or roottalk. Might I suggest, that instead of the global variable Atom and the function setAtomDefaults(), have a static member of BioAtomLibrary and a static function, like: typedef map<string,BioAtom> BioAtomLibrary; class BioAtom { public: static BioAtomLibrary Library; private: static bool isInitialised; ... public: ... static Initialise() { if (isInitialised) return; isInitialised = true; Atom["H"] = BioAtom(1,"H","Hydrogen",1.008,0.78,0); ... } ... }; with #pragma link C++ class BioAtom; #pragma link C++ typedef BioAtomLibrary; This is much cleaner from a programing point of view, since you hide the array in the scope of a class. You can then access elements in the list with BioAtom::Initialise(); BioAtom& hydrogen = BioAtom::Library["H"]; int hydrogenNumber = BioAtom::Library["H"].getAtomicNumber(); and so on. If you in a particular piece of code would prefer to have a direct reference to the library, you can do BioAtomLibrary& Library = BioAtom::Library; and then use Library directly: int hydrogenNumber = Library["H"].getAtomicNumber(); It may be that this approach will solve your problems too :-) Yours, Christian Holm Christensen ------------------------------------------- Address: Sankt Hansgade 23, 1. th. Phone: (+45) 35 35 96 91 DK-2200 Copenhagen N Cell: (+45) 28 82 16 23 Denmark Office: (+45) 353 25 305 Email: cholm@nbi.dk Web: www.nbi.dk/~cholm
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:59 MET