2013-03-14 5 views
1

저는 FORTRAN 90에 3D 배열을 조각으로 초기화하는 작은 테스트 케이스 프로그램을 작성했습니다. 이 동일한 동작을 C에서 쉽게 복제 할 수 있습니까?다차원 배열을 Fortran과 비슷한 C로 초기화합니다.

program fortranEngine 

    real(4) , dimension(10,10) :: tmp 
    real(4) , dimension(10,10,3) :: p  

    tmp = RESHAPE([ 0.973, 1.053, 0,  0,  0,  0,  0,  0,  0,  0, & 
        1.053, 1.080, 0,  0,  0,  0,  0,  0,  0,  0, & 
        1.010, 0.408, 0.442, 0,  0,  0,  0,  0,  0,  0, & 
        1.119, 0.900, 0.399, 0.762, 0,  0,  0,  0,  0,  0, & 
        1.211, 0.975, 0.845, 0.952, 1.105, 0,  0,  0,  0,  0, & 
        1.248, 1.016, 0.485, 0.000, 0.000, 1.110, 0,  0,  0,  0, & 
        1.225, 1.123, 1.056, 0.000, 0.000, 0.949, 0.832, 0,  0,  0, & 
        1.138, 1.232, 1.089, 1.050, 0.930, 0.402, 0.789, 0.774, 0,  0, & 
        1.149, 1.406, 1.201, 1.052, 0.416, 0.878, 0.896, 0.431, 1.144, 0, & 
        1.351, 1.255, 1.290, 1.358, 1.240, 1.228, 1.257, 1.140, 1.123, 1.228] & 
        , [10,10])  

    p(:,:,1) = tmp  

    ... 

    end program fortranEngine 
+2

왜 C에서 이것을 복제해야합니까? C 프로그램에서 Fortran 루틴을 호출하면됩니다. –

+0

[이] [1]을 시도해보십시오. [1] : http://stackoverflow.com/questions/2178909/how-to-initialize-3d-array-in-c –

+0

언제나처럼, 실제 (4) 어쩌면 일을 당신을합니까하지 않을 수 있습니다 그것이라고 생각합니다. 특히 그것은 실제와 동등하지 않습니다 * 4 –

답변

1

충분히 간단합니까?

for(int i = 0 ; i < 10 ; ++i) 
    for(int j = 0 ; j < 10 ; ++j) 
     p[0][i][j] = tmp[i][j] ; 
+0

tmp와 p가 공간을 공유하는 것에 신경 쓰지 않는다면'double (* p [3]) [10] [10];을 선언하고' p [0] = & (tmp [0] [0]);'. 그러나 다른 두 슬라이스는 널 포인터로 표시됩니다. –

+0

이러한 배열 배열은 실제로 Fortran 3D 배열과 동일하지 않습니다. –

+0

@ Vladimir F. 내 의견에 그 뜻이 있다면, 맞습니다. 내 대답은 'p'가'double [3] [10] [10];으로 선언 된 것으로 가정합니다. 이것은 포트란과 유사하다고 생각합니다. 그러나, 나는 f77 일 이후로 fortran을 사용하지 않았다. 그래서 아마도 무언가가 바뀌었다. –

2

C99 또는 C2011에서 더 많거나 적게 할 수 있지만 Fortran처럼 편리하지는 않습니다. initialization 주문; Fortran은 하나의 순서 (컬럼 메이저)에서 그것을 수행하고 C는 다른 (행 메이저)에서 그것을 수행한다. 그 무시, 당신은 할 수 있습니다 : 그래도, 선언의 시작 선언의 끝에서 차원 [3] 이동

float tmp[10][10] = 
{ 
    { 0.973, 1.053, 0,  0,  0,  0,  0,  0,  0,  0, }, 
    { 1.053, 1.080, 0,  0,  0,  0,  0,  0,  0,  0, }, 
    { 1.010, 0.408, 0.442, 0,  0,  0,  0,  0,  0,  0, }, 
    { 1.119, 0.900, 0.399, 0.762, 0,  0,  0,  0,  0,  0, }, 
    { 1.211, 0.975, 0.845, 0.952, 1.105, 0,  0,  0,  0,  0, }, 
    { 1.248, 1.016, 0.485, 0.000, 0.000, 1.110, 0,  0,  0,  0, }, 
    { 1.225, 1.123, 1.056, 0.000, 0.000, 0.949, 0.832, 0,  0,  0, }, 
    { 1.138, 1.232, 1.089, 1.050, 0.930, 0.402, 0.789, 0.774, 0,  0, }, 
    { 1.149, 1.406, 1.201, 1.052, 0.416, 0.878, 0.896, 0.431, 1.144, 0, }, 
    { 1.351, 1.255, 1.290, 1.358, 1.240, 1.228, 1.257, 1.140, 1.123, 1.228 }, 
}; 
float p[3][10][10];  

for (int i = 0; i < 3; i++) 
    memmove(p[i], tmp, sizeof(tmp)); 

참고. 다른 방법으로는 C에서 그다지 타당하지 않을 것입니다. 따라서 표기법은 다소간 사용 가능하지만 스토리지 관리에 대한 세부 사항은 원하는 것을 정확히 성취하는 방법을 분명히하지 못합니다.