From: Uno on 13 Jul 2010 01:20 This is a bit of a repost. I wanted to clean up the context, refocus, and thank parties who got me over the hump with my latest foray into interop. Elliot helped me tremendously by giving me the proper query syntax for google groups on c.l.f. I'll just show that again for interested parties: interop zax keyword site:groups.google.com/group/comp.lang.fortran Erik managed to tell me -c without applying any of the flame opportunity that existed. thx. I've really been enjoying a chapter of MR&C that I hadn't read closely. Now that I've gotten one good result with interop, I want more. I believe that the declaration of pass on p. 259 is to enable the passing of a 2-d array from C to fortran. Although a lot of this stuff works in both directions, I am now focusing on C to fortran. Critical to this treatment is this struct (Richard is of course correct that it is no subroutine. It's funny how a person gets crossed up between syntaxes.): struct pass { int lenc, lenf; float *c, f; }; Since I got Michael Metcalf to straighten me out once on this, I'm hoping to get another good break. I really don't know much about how fortran arrays look like underneath the hood; I've never had the need to look. Anyways, this is what I've got now: $ gcc -c -lm c_mm3.c -o caller.o $ gfortran -c -Wall -Wextra f_mm2.f03 -o pass.o $ gcc pass.o caller.o -lgfortran -o out $ ./out vector[0][0] is 0.785398 vector[0][1] is 2.107149 vector[0][2] is 3.249046 vector[0][3] is 4.325818 vector[0][4] is 5.373401 vector[0][5] is 6.405648 vector[0][6] is 7.428899 vector[1][0] is 2.107149 vector[1][1] is 3.249046 vector[1][2] is 4.325818 vector[1][3] is 5.373401 vector[1][4] is 6.405648 vector[1][5] is 7.428899 vector[1][6] is 8.446442 vector[2][0] is 3.249046 vector[2][1] is 4.325818 vector[2][2] is 5.373401 vector[2][3] is 6.405648 vector[2][4] is 7.428899 vector[2][5] is 8.446442 vector[2][6] is 9.460139 vector[3][0] is 4.325818 vector[3][1] is 5.373401 vector[3][2] is 6.405648 vector[3][3] is 7.428899 vector[3][4] is 8.446442 vector[3][5] is 9.460139 vector[3][6] is 10.471128 vector[4][0] is 5.373401 vector[4][1] is 6.405648 vector[4][2] is 7.428899 vector[4][3] is 8.446442 vector[4][4] is 9.460139 vector[4][5] is 10.471128 vector[4][6] is 11.480137 0.78539819 2.1071486 3.2490458 4.3258176 5.3734007 $ So, my C output doesn't look like my fortran output. In, particular, the fortran output shows no dimensionality greater than one. Here are the source listings: $ cat c_mm3.c #include <stdio.h> #include <math.h> #include <stdlib.h> #define size1 5 #define size2 7 struct pass { int lenc, lenf; float *c, f; }; void simulation (struct pass *arrays); int main () { float vector[size1][size2]; int i, j; struct pass arrays; for (i = 0; i < size1; ++i) for (j = 0; j < size2; ++j) { { vector[i][j] = atan (1 + i + j) + i + j; printf ("vector[%d][%d] is %f\n", i, j, vector[i][j]); } } arrays.lenc = size1; arrays.lenf = size2; arrays.c = &vector[0][0]; // arrays.f = NULL; simulation (&arrays); return 0; } // gcc -c -lm c_mm3.c -o caller.o // gcc pass.o caller.o -lgfortran -o out $ cat f_mm2.f03 subroutine simulation(arrays) bind(c) use iso_c_binding type, bind(c) :: pass integer (c_int) :: lenc, lenf type (c_ptr) :: c, f end type pass type (pass), intent(in) :: arrays real (c_float), pointer :: c_array(:) ! associate c_array with an array allocated in C call c_f_pointer( arrays%c, c_array, (/arrays%lenc/) ) print *, c_array end subroutine simulation ! gfortran -c -Wall -Wextra f_mm2.f03 -o pass.o $ Simple question: how do I get the fortran output to show the values that the C output does *and* show up in the types of rows and columns that a person wants who got an A in fortran 20 years ago and doesn't feel like just taking a slopshot. Thanks for your comments, and cheers, -- Uno
|
Pages: 1 Prev: A note on two Fortran related projects Next: MR&C chp 14 |