no viable conversion from TObject * to TDirectory

image

no viable conversion from TObject * to TDirectory

 در بسیاری از برنامه های نوشته در GEANT4 فراخوانی اطلاعات به صورت زیر نوشته شده است.

TFile f("radioprotection_NEW.root");
TDirectory* dir = f.Get("radioprotection_ntuple");
TNtuple * ntuple1 = (TNtuple*)dir->Get("101");   

هنگام اجرای این دستور پیام زیر رخ می دهد.

no viable conversion from 'TObject *' to 'TDirectory'

کد چه پردازشی انجام می دهد؟

فایل radioprotection_NEW.root   حاصل اجرایی برنامه میکرودزیمتری در GEANT4 است. پس از اجرای برنامه درون آن اطلاعات در مسیر radioprotection_ntuple ذخیره می شود. بنابراین ابتدا فایل radioprotection_NEW.root را به عنوان متغیر f از جنس TFile معرفی می کنیم. حال می گوییم که مسیر radioprotection_ntuple  را فراخوانی و به عنوان متغییر dir ذخیره کن.

مشکل این است که در root بین متغییر هایی از جنس * و بدون * فرق می کند. بنابراین متغییری از جنس بدون * را وقتی میخواهد به متغییری به جنس با * تبدیل کند خطا می می دهد. برای حل این مشکل دستور را به صورت زیر باز نویسی می کنیم.

TFile f("radioprotection.root");
TDirectory* dir =(TDirectory*) f.Get("radioprotection_ntuple"); 

در این حالت ابتدا متغییر به حالت * دار تبدیل می شود و توسط فرآیند انتصاب با استفاده از عملگر = صورت میگیرد.