Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!samsung!uakari.primate.wisc.edu!uflorida!gatech!bloom-beacon!athena.mit.edu!mlzerkle From: mlzerkle@athena.mit.edu (Michael L Zerkle) Newsgroups: comp.sys.sgi Subject: Cross-Language Communication problem between FORTRAN & C. Message-ID: <1990Nov9.212649.27564@athena.mit.edu> Date: 9 Nov 90 21:26:49 GMT Sender: daemon@athena.mit.edu (Mr Background) Reply-To: mlzerkle@athena.mit.edu (Michael L Zerkle) Organization: Massachusetts Institute of Technology Lines: 102 I am trying to develop C functions to allocate and deallocate arrays for use in a FORTRAN progam that would run on a number of different UNIX boxes (DEC VS3100, Apollo, SGI 4D/210, etc.). The C functions I have written appear to allocate the double array correctly, but either it does not pass it back the the FORTRAN program correctly, or the FORTRAN program is not accepting the pointer/array it is returning. Does anyone out there have any experience with problems of this sort, or know what I am doing wrong? Any suggestions? Basic info: SGI 4D/210VGXB f77 compiler ANSI C compiler same problem on other UNIX systems. Thanks in advance for any help. Mike Zerkle mlzerkle@athena.mit.edu ******************** * Fortran Code ... * ******************** program testgetm real*8 a(1) integer*4 maxa,bytesa,i external getmd,freemd c maxa=5 bytesa=8 c c Write Initial location. c write(6,'(a)') 'Initial address' write(6,*) loc(a),maxa,bytesa c c Allocate real*8 array. c call getmd(a,maxa) c c Write addresses c write(6,'(a)') 'Final address' write(6,*) loc(a),maxa,bytesa c c Work on array c write(6,'(a)') 'REAL*8 array ' if (loc(a).ne.0) then do 10 i=1,maxa c a(i)= 1.0d+0*i write(6,*) i, a(i) 10 continue else write(6,'(a)') ' Unable to allocate r*8 array a' endif c c Free arrays. c if (loc(a).ne.0) call freemd(a) c stop end ************** * C Code ... * ************** #include void getmd_(double *array, int *nelem) { printf("org array addr = %ld\n",array); array = (double *) calloc((size_t) *nelem, (size_t) sizeof(double)); printf("new array addr = %ld\n",array); } void freemd_(double *array) { free((void *) array); } ********************* * Sample output ... * ********************* Initial address 29996 5 8 org array addr = 29996 new array addr = 54272 Final address 29996 5 8 REAL*8 array 1 0. 2 0. 3 0. 4 1.1840974637956d+30 5 5.2810833895564d-20 Keywords: