功能介绍:fortran调用C++ 实现数组的传递,同时写到ROOT文件,
多次调用的数据可以连续写到同一个ROOT文件
使用说明:g++ -c mycpp.cpp -I`root-config --incdir`
`root-config --glibs` `root-config --libs`
gfortran -c
myfort.f90
gfortran
myfort.o mycpp.o -lstdc++ -o test -I`root-config
--incdir` `root-config --glibs` `root-config --libs`
./test
fortran代码,文件名:myfort.f90
program
main
integer
i,num,j
parameter(num=1000000)
real
arr(4,num)
do j=1,5
do
i=1,num
call
random_number(arr(2,i))
call
random_number(arr(3,i))
arr(1,i)=i
end do
arr(4,:)=j
call
gotoc(num,arr,j)
end do
end
program
C++代码,文件名:mycpp.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
//获取时间信息的头文件
using namespace
std;
extern "C" void
gotoc_(int *num,float arr[][4], int *jj)
{
float
v1,v2,v3,v4;
float
start,end,time;
TFile
*f;
TTree
*t2;
start=clock();//开始时间
if(*jj==1)
{//为了更新数据,要在第一次写的时候新建ROOT文件
f= new
TFile("test.root","recreate");//新建文件
t2= new
TTree("t2","test");//新建TREE
t2->Branch("v1",&v1,"v1/F");
t2->Branch("v2",&v2,"v2/F");
t2->Branch("v3",&v3,"v3/F");
t2->Branch("v4",&v4,"v4/F");//新建BRANCH,定义名称和数据类型
}else{
f = new
TFile("test.root","update");//非第一次写入的时候,使用UPDATE连续写入
t2 =
(TTree*)f->Get("t2");//读取TREE
t2->SetBranchAddress("v1",&v1);
t2->SetBranchAddress("v2",&v2);
t2->SetBranchAddress("v3",&v3);
t2->SetBranchAddress("v4",&v4);//指定BRANCH地址
}
for(int
i=0;i<=*num-1;i++)//循环数组
{
v1=arr[i][0];
v2=arr[i][1];
v3=arr[i][2];
v4=arr[i][3];
t2->Fill();//写入数据
}
t2->Write("",
TObject::kOverwrite);//把数据从内存写到文件,同时保存最新的数据
f->Close();
delete
f;
end=clock();//结束时间
time=(end-start)/CLOCKS_PER_SEC;//计算时间
单位S
cout
<< "time:"
<< time
<< endl;
}
运行结果:
生成test.root文件
其中 event
5000000个(循环5次)
4个BRANCH