Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/3/84; site cfa.UUCP Path: utzoo!watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!panda!talcott!cfa!wyatt From: wyatt@cfa.UUCP (Bill Wyatt) Newsgroups: net.unix Subject: Re: Calling f77 routines from C: HELP! Message-ID: <175@cfa.UUCP> Date: Mon, 27-Jan-86 11:47:39 EST Article-I.D.: cfa.175 Posted: Mon Jan 27 11:47:39 1986 Date-Received: Thu, 30-Jan-86 06:30:26 EST References: <1930@uwmacc.UUCP> Distribution: net Organization: Harvard-Smithsonian Center for Astrophysics Lines: 149 > This applies to 4.2BSD and Ultrix-32M v1.1: > > I am trying to call a f77 subroutine from a C program, > and I find that the supposedly "preconnected" i/o units 5 and 6 > are not connected. That is, when I do a simple print in the > Fortran subroutine, like: > > print *, 'hi!' > > I get an entry in a file called fort.6. [...] > > Jeff Percival ...!uwvax!uwmacc!jwp This sounds very much like something Donn Seeley helped people with a while back. I'll repost some of his original article: >From donn@utah-gr.UUCP (Donn Seeley) Sun Feb 6 01:28:16 206 >Subject: Re: C calls FORTRAN subroutine >Message-ID: <1207@utah-gr.UUCP> >Date: Fri, 12-Oct-84 22:34:17 EDT > >>From the original article by Aldrin Leung: > > In the C program, I have > ---------- > #include > > main() > { > try_() > } > ---------- > > In the Fortran program, I have > ---------- > subroutine try > write (6,100) > 100 format ("subprogram") > end > ---------- > >When these routines are compiled, loaded together and run, they print >nothing. > >The problem here is that f77's I/O system needs to be 'primed'. The >standard f77 main() routine does this for you, but if you substitute >your own C main() routine then you have to do the 'priming' yourself. >There is an f77 I/O clean-up routine which you can call too (it's >not as important, though). Without the 'priming', f77 I/O (at least >on pre-defined units) will have no effect. A demonstration of the >the use of the priming and clean-up routines appears below. > >Since f77 uses the C stdio library, you can mix C and f77 I/O by using >stdio in your C routines rather than straight Unix system calls. Since >it may be difficult to predict which stdio file pointers are associated >with which f77 unit numbers, it's probably a good idea to stick with >'stdin', 'stdout' and 'stderr' when doing C I/O. > >One other thing that is useful to have is a MAIN_() routine. This is >normally created by f77 when it compiles the MAIN section of a program, >but if you replace the f77 main() with a C main(), it never gets >defined and f77 will complain about it if you use f77 to compile or >load your program. (Yes, f77 will compile C files, one of its many >peculiar features. Yes, this is useful because it means you can get >all of the f77 libraries without having to specify them explicitly, as >you would if you loaded your C and f77 objects 'by hand'. Again, see >below for an example of this.) > >Here's an example that demonstrates all of these features. Put the >following code in a file 'c_main.c': > >------------------------------------------------------------------------ ># include > >main( argc, argv, envp ) > int argc; > char **argv; > char **envp; >{ > /* > * Process your arguments and environment here. > */ > > /* > * Prime the f77 I/O routines, call MAIN_(), and clean up. > */ > f_init(); > MAIN_(); > f_exit(); > exit( 0 ); >} > >MAIN_() >{ > /* > * Call various f77 and C routines. > */ > c_routine(); > f77routine_(); >} > >c_routine() >{ > printf( "First some C I/O, then" ); >} >------------------------------------------------------------------------ > >Put the following code in a file named 'f77_routines.f': > >------------------------------------------------------------------------ > subroutine f77routine() > > print *, 'some f77 I/O.' > > return > end >------------------------------------------------------------------------ > >Then compile the two files like this: > >------------------------------------------------------------------------ >% f77 c_main.c f77_routines.f -o cf >c_main.c: >f77_routines.f: > f77routine: >% >------------------------------------------------------------------------ > >When you run the program, you get: > >------------------------------------------------------------------------ >% ./cf >First some C I/O, then some f77 I/O. >% >------------------------------------------------------------------------ > >I hope this wasn't too complicated, > >Donn Seeley UCSD Chemistry Dept. ucbvax!sdcsvax!sdchema!donn >32 52' 30"N 117 14' 25"W (619) 452-4016 sdcsvax!sdchema!donn@nosc.ARPA BTW, the above is *not* Donn's current net address (see first lines of this posting). -- Bill UUCP: {seismo|ihnp4|cmcl2}!harvard!talcott!cfa!wyatt Wyatt ARPA: wyatt%cfa.UUCP@harvard.HARVARD.EDU