Calling f77 routines from C: HELP!
Bill Wyatt
wyatt at cfa.UUCP
Tue Jan 28 02:47:39 AEST 1986
> 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 at utah-gr.UUCP (Donn Seeley) Sun Feb 6 01:28:16 206
>Subject: Re: C calls FORTRAN subroutine
>Message-ID: <1207 at 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 <stdio.h>
>
> 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 <stdio.h>
>
>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 at 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 at harvard.HARVARD.EDU
More information about the Comp.unix
mailing list