2014-10-31 1 views
1

몇 주 전에 비슷한 질문을 게시했는데 문제가 해결되었습니다. 이제 몇 가지 사항을 수정했으며 몇 가지 문제가 다시 발생합니다. 다음은 간단한 문제입니다. 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,210

x_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*보다 취

답변

5
는 귀하의 인터페이스를 변경

참조로.

% ./main 
x_in, x_fin before = 1.0000000000000000  2.0000000000000000  3.0000000000000000  4.0000000000000000  0.0000000000000000  0.0000000000000000  0.0000000000000000  0.0000000000000000  
BHsp 0.700000 
t0 1.000000 
r0 2.000000 
m0 3.000000 
phi0 4.000000 
t1 2.000000 
r1 3.000000 
m1 4.000000 
phi1 5.000000 
return rt =   0 
x_in, x_fin after = 1.0000000000000000  2.0000000000000000  3.0000000000000000  4.0000000000000000  2.0000000000000000  3.0000000000000000  4.0000000000000000  5.0000000000000000 
+0

가 대단히 케이시 감사 :이 작은 변화와

이 당신의 예제 코드의 출력 (그리고 C에 약간의 변화가 실제로 mphi의 값을 인쇄합니다)! 잘 작동합니다! – Syph

+0

Casey,이 문제를 살펴보실 수 있습니까? http://stackoverflow.com/questions/26740373/iso-c-binding-calling-c-routine-with-pointers-from-fortran? 나는 그것이 당신만큼 사소한 것 같아요! 고맙습니다 – Syph

관련 문제