This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Calling FORTRAN from C
- To: gcc at gcc dot gnu dot org
- Subject: Calling FORTRAN from C
- From: "Robert Kuhn" <Robert_Kuhn at mgic dot com>
- Date: Mon, 4 Dec 2000 08:52:02 -0600
To:gcc@gcc.gnu.org
From: Bob Kuhn
Subject: Calling FORTRAN from C
I have a FORTRAN program in which I do not know in advance how large
some of the arrays will be. Standard FORTRAN has no "alloc"
statement to allocate arrays at execution time.
Looking at the GNU FORTRAN documentation, I have concluded that
there is no direct way to do this. AM I CORRECT?
In ABSOFT PC FORTRAN and C, I was able to solve the problem by
allocating the arrays in C and calling my FORTRAN program as a
subroutine from C. Is this practical to do in GNU FORTRAN and C? I
do not want to spend a lot of time if this is very difficult to
accomplish.
In order do this, I need to do the following:
1. How to call FORTRAN from C.
2. I need to able to pass integers, arrays (both numeric and
character) to the FORTRAN program.
3. I need to be able to use "alloc" in C with adjustable arrays in
FORTRAN.
I was able to do all these things with the ABSOFT PC compilers. I
have no idea how difficult this is to do with the GNU compilers.
Appendix's 1 and 2 contains two programs that worked on the ABSOFT
PC compiler. Appendix 1 contains the simplist possible program with
C calling FORTRAN. I tried it on the GNU UNIX compiler on they did
not work. Details are in that appendix. Appendix 2 contains very
simple working PC programs with all the features that I need.
I have two questions:
1. Why did the programs in appendix 1 not work?
2. Will it be difficult to the programs in appendix 2 to work with
the GNU compilers? Do you consider this a practical approach?
Any advice on this subject will be greatly appreciated.
Sincerely,
Bob Kuhn
P.S. When I ran the ABSOFT version I did not use "#include <g2c.h>"
----------------------------------------------------------
Appendix 1 -- Simple Program for calling FORTRAN from C
1. C Program (testbob.c)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <g2c.h>
int main(int argc, char * argv[])
{
void sub1(void);
printf("Start Program\n");
sub1();
printf("End Program\n");
exit(0); return(0);
}
2. FORTRAN SUBROUTINE (sub1.for)
subroutine sub1
print *, 'This is SUB1'
return
end
3. Compile steps
gcc -c testbob.c
g77 -c sub1.for
4. Link edit step
g77 testbob.o sub1.o -o testbob
5. Link edit error message:
/data/user/rmk/mars$ g77 testbob.o sub1.o -o testbob
Undefined
Undifined first referenced
symbol in file
sub1 testbob.o
ld: fatal: Symbol referencing errors. No output written to
testbob collect2: ld returned 1 exit status
The question is: WHAT DID I DO WRONG?
----------------------------------------------------------
Appendix 2 -- Simple Example with Dynamic Allocation
1. C Program
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*#include <g2c.h>*/
#define false 0
#define true 1
int main(int argc, char * argv[])
{
/* Use the typedefs in <g2c.h> */
/* real *x; integer n; */
float *x; long n; short j;
char c[12] ="All is well";
void test5a(long *n,float *x,char *c);
printf("Start Program\n");
if ( (x = calloc(1000,4)) == NULL) {
printf("Allocation of 'x' failed\n");
exit(1);
}
n=1000;
printf("n=%ld\n",n);
for (j=0; j < 1000; j++) {x[j]=2*(j+1);}
printf("Call subroutine\n");
test5a(&n,x,c);
printf("End Program\n");
exit(0); return(0);
}
2. FORTRAN SUBROUTINE
subroutine test5a(n,x,c)
dimension x(n)
character*12 c
print *,'n=',n,' x(501)=',x(501),' c=',c(1:11)
return
end
This program worked with the ABSOFT PC compiler. How difficult
would it be to get this program to work with the GNU system?