몇 주 전에 비슷한 질문을 게시했는데 문제가 해결되었습니다. 이제 몇 가지 사항을 수정했으며 몇 가지 문제가 다시 발생합니다. 다음은 간단한 문제입니다. ISO_C_BINDING 포트란에서 C 루틴 호출하기 (double과 배열 사용)
나는 포트란에서 메인 프로그램이 있습니다module raytracing
Interface
integer (C_INT) function photon_trace(BHsp, x_init, x_final) &
bind(C, name='photon_trace')
use , intrinsic :: ISO_C_BINDING
implicit none
real(C_DOUBLE) :: BHsp, x_init(4), x_final(4)
end function photon_trace
end interface
end module raytracing
이는 C 루틴입니다 :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
#undef I
int photon_trace(double BHsp, double x_init[4], double x_final[4])
//***************************************************
{
printf("BHsp %f\n", BHsp);
double r,m,t,phi;
t = x_init[0];
r = x_init[1];
m = x_init[2];
phi = x_init[3];
printf("t0 %f\n", t);
printf("r0 %f\n", r);
printf("m0 %f\n", t);
printf("phi0 %f\n", r);
t=t+1.0;
r=r+1.0;
m=m+1.0;
phi=phi+1.0;
printf("t1 %f\n", t);
printf("r1 %f\n", r);
printf("m1 %f\n", t);
printf("phi1 %f\n", r);
x_final[0] = t;
x_final[1] = r;
x_final[2] = m;
x_final[3] = phi;
return 0;
}
는 C 루틴에 대한 인터페이스를 포함하는 서브 루틴을 사용
program main_dummy
! compile: gcc -c dummy_trace.c
! f95 raytracing.f90 main_dummy.f90 dummy_trace.o -o main
use, intrinsic :: ISO_C_BINDING
use raytracing
implicit none
!real(kind=8) :: x_in(4), x_fin(4)
real(C_DOUBLE), dimension(0:3) :: x_in, x_fin
real(C_DOUBLE) :: spin
integer :: rt_ok
x_in = (/1,2,3,4/)
x_fin = (/0,0,0,0/)
spin = 0.7
write(*,*)'x_in, x_fin before = ', x_in, x_fin
rt_ok = photon_trace(spin,x_in,x_fin)
write(*,*)'return rt = ', rt_ok
write(*,*)'x_in, x_fin after = ', x_in, x_fin
end program main_dummy
프로그램을 컴파일하고 실행하면 다음과 같습니다.
,363,210x_in 전에 x_fin = 1.0000000000000000 2.0000000000000000 3.0000000000000000 4.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000
0.000000
T0 0.700000
R0 0.000000
M0 0.700000
phi0 0.000000
,617 BHSP 451,515,T1 1.700000
R1 1.000000
M1 1.700000
phi1 1.000000
복귀 RT = 0
x_in, x_fin 후 = 1.6999999880790710 1.0000000000000000 1.0000000000000000 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000
변수 "spin"을 넣기 전에 모든 것이 작동한다는 것을 알 수 있습니다. 그것은 입력 배열을 읽고, opration을 만들고, 올바른 출력을 줄 수 있습니다.
ths 변수를 추가 했으므로 C 루틴에서 전달하는 내용을 읽는 데 몇 가지 문제가 있으며 잘못된 점을 이해할 수 없습니다. 제안 사항이 있으십니까?
(실제 변수에서 치수가 4 인 2 개의 입력 및 2 개의 출력 배열뿐만 아니라 여러 변수를 전달할 것임을 고려하십시오).
미리 감사드립니다.
이module raytracing
Interface
integer (C_INT) function photon_trace(BHsp, x_init, x_final) &
bind(C, name='photon_trace')
use , intrinsic :: ISO_C_BINDING
implicit none
real(C_DOUBLE) :: x_init(4), x_final(4)
real(c_double), value :: BHsp
end function photon_trace
end interface
end module raytracing
귀하의 C 함수가 그래서 당신은 포트란은 기본 패스가 아닌 값으로 전달하는 알 수 있도록 value
속성 스칼라를 전달하는 데 필요 double
오히려 double*
보다 취
가 대단히 케이시 감사 :이 작은 변화와
이 당신의 예제 코드의 출력 (그리고 C에 약간의 변화가 실제로m
및phi
의 값을 인쇄합니다)! 잘 작동합니다! – SyphCasey,이 문제를 살펴보실 수 있습니까? http://stackoverflow.com/questions/26740373/iso-c-binding-calling-c-routine-with-pointers-from-fortran? 나는 그것이 당신만큼 사소한 것 같아요! 고맙습니다 – Syph