popovda
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Привет! Возникла задача вызывать из Fortran-программы функции статической C-библиотеки. Решил заодно разобраться с iso_c_binding. Накидал тестовое приложение, чтобы понять что и как надо передавать. Вроде всё делаю по мануалу, но правильно срабатывает вызов только первой функции show. Остальные выводят на экран нули и возвращают неверный результат. Может кто подскажет в чём дело? Компилятор Intel Fortran 10.1 и VS 2005. Код C-библиотечки: Код: #include <stdio.h> // Вот она работает void show(int x){ printf("Value = %d\n",x); } // А эти нет double copyVal(double A){ printf("C: A = %f\n",A); return A; } double getSum(int sz,double Arr[]){ int k = 0; double Sum = 0; printf("C: sz = %d\n",sz); printf("C: \n"); for(k = 0; k<sz; k++){ printf("\t %f\n",Arr[k]); } for(k = 0; k<sz; k++) Sum+=Arr[k]; return Sum; } | И Фортрановский код: Код: module mod_CData use, intrinsic :: iso_c_binding; implicit none; interface !void show(int x) subroutine Show(x) bind(C,name = "show") use, intrinsic :: iso_c_binding; implicit none; integer(c_int), value, intent(in) :: x; end subroutine Show; !double getSum(int sz,double *Arr) real(c_double) function GetSum(sz, A) bind(C,name="getSum") use, intrinsic :: iso_c_binding; implicit none; integer(c_int), value, intent(in) :: sz; real(c_double), dimension(:) :: A; end function GetSum; !double copyVal(double A) real(c_double) function CopyVal(x) bind(C,name = "copyVal") use, intrinsic :: iso_c_binding; implicit none; integer(c_double), value :: x; end function CopyVal; end interface; end module mod_CData program Test_binding use mod_CData; integer(4), parameter :: M = 10; integer(4) :: test_val; real(8) :: res; real(8),target,dimension(1:M) :: Arr; real(8),pointer,dimension(:) :: pArr; test_val = 10; call Show(test_val); print *,"c_int = ",c_int; print *,"c_double",c_double; Arr = (/10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0/); print *,'Arr:' print *,Arr; pArr => Arr; res = GetSum(size(Arr), pArr); print *,'Res = ',res; print *,'CopyVal = ', CopyVal(dble(100.0_8)); read(*,*); end program Test_binding | Может кто поможет решить проблему. В идеале мне надо из C-шных оберток вызывать C++-код GUI, принимающий параметры задачи и выводящий решения на каждом шаге. Если у кого-то будет желание посмотреть проект и его работу - то он доступен по ссылке: http://stream.ifolder.ru/11315393 Добавлено: Решено. Массивы - функции принимают их как указатели в C, значит надо передавать c_loc(Array). На forum.vingrad.ru выложил рабочий пример. | Всего записей: 5 | Зарегистр. 24-07-2007 | Отправлено: 21:43 29-03-2009 | Исправлено: popovda, 21:48 29-03-2009 |
|