Declarations:
> extern "C" void herfasy_(double*,double*, double*,double*);
with calling sequence:
> herfasy_(&Enbeam,&thetas,&omega,&asytt);
and
> > extern "C" void herfasy_(double &,double &, double &,double &);
with calling sequence:
> herfasy_(Enbeam,thetas,omega,asytt);
are both correct. The passing of arguments by pointer or by reference
are exactly the same.
Victor
Brett Viren wrote:
>
> Besides the suggestion to make sure the fortran code actually takes
> REAL*8 instead of just REAL, I think your declaration and calling is
> wrong. Fortran ``passes by reference'' but this really means ``passes
> by pointer''. (At least this has always been the case when I mix C
> and Fortran). So, I think your declaration should be:
>
> extern "C" void herfasy_(double*,double*, double*,double*);
>
> And you should call it like:
>
> herfasy_(&Enbeam,&thetas,&omega,&asytt);
>
> Luck,
> -Brett.
>
> Wang Xu writes:
> > Dear Rooters,
> > I try to link a fortran code(herasy.f) to the c++ code. The
> > fortran code by itself works fine but if it link to this c++ code, one of
> > subroutine of the fortran code dosen't give a right answer. Have you ever
> > met same problem? If you did, please give me some suggestion as soon as
> > possible.
> > (I suspicious that I didn't put correct flag when I complie these two
> > code. what I did is following:
> > f77 -c herfasy.f *.f
> > g++ -c acceptance.cxx
> > g++ herfasy.o *.o acceptance.o -L/lib -l* -lg2c)
> > Thanks,
> > wang
> > Here is the acceptance.cxx
> > #include <stdio.h>
> > #include <iostream.h>
> >
> > // ROOT include
> > #include "TROOT.h"
> > #include "TFile.h"
> > #include "TNtuple.h"
> > #include "TMath.h"
> >
> > extern "C" void herfasy_(double &,double &, double &,double &);
> >
> > int main()
> > {
> > TROOT accept("accept","accept");
> > TFile *f = new
> > TFile("/work/halla/e95001-2/wangxu/hbook/eq05/gmn_1pass_21067.root");
> > TNtuple *h1 = (TNtuple*) f->Get("h1");
> > Float_t asyt,thetat, yt, phit, deltat;
> > double Enbeam,omega,thetas,asytt;
> > Int_t nbytes;
> > Enbeam=1.727;
> > Float_t Eset=1.453;
> > Float_t thed = 25.80;
> > // Set branch addresses
> > h1->SetBranchAddress("Ethetat", &thetat); // in mr
> > h1->SetBranchAddress("Ephit", &phit); // in mr
> > h1->SetBranchAddress("Eyt", &yt); // in mm
> > h1->SetBranchAddress("Edelta", &deltat); // in %
> > TFile *acceptance = new TFile("acceptance.root", "RECREATE");
> > TNtuple *ntuple = new TNtuple("ntuple", "Asymetry Study",
> > "Ethetat:Ephit:Eyt:Edelta:asyt");
> > // Total event number
> > //Int_t nentries = (Int_t) h1->GetEntries();
> > Int_t nentries=1;
> > for(Int_t i=0; i<nentries; i++) {
> > nbytes += h1->GetEvent(i);
> > thetas=acos(cos(thed*3.1415926/180+phit/1000)*cos(thetat/1000));
> > thetas= thetas*180/3.1415926;
> > omega=Enbeam-Eset*(1+deltat/100);
> > herfasy_(Enbeam,thetas,omega,asytt);
> > asyt=asytt;
> > printf("%f\n",asyt);
> > ntuple->Fill(thetat,phit,deltat,asyt);
> > }
> > ntuple->Write();
> > f->Close();
> > acceptance->Close();
> > return(0);
> > }
> >
> >
> >
> >
> >
> >
--
Victor M. Perevoztchikov perev@bnl.gov perev@vxcern.cern.ch
Brookhaven National Laboratory MS 510A PO Box 5000 Upton NY 11973-5000
tel office : 631-344-7894; fax 631-344-4206; home 631-345-2690
This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:41 MET