2017-12-08 24 views
0

일부 c 함수를 포트란으로 변환합니다. 내 C 루틴에서, 거기에 내가 다음과 같이 FORTRAN 두 유형 정의 위의 변환 복잡한 c 함수를 포트란으로 변환

typedef struct heapnode { 
       double c; 
       int n; 
        } heapnode; 

typedef struct heap { 
       int n; 
       int sz; 
       heapnode *d; 
        } heap; 

아래와 같은 두 가지 구조를 정의하고 그것을 잘 작동합니다.

type heapnode 

    real*8 :: c 
    integer*4 :: n 

    endtype heapnode 


    type heap 

    integer*4 :: n 
    integer*4 :: sz 
    type(heapnode), pointer :: d 

    endtype heap 

제 질문은 위 두 구조의 시작에 대한 것입니다. 요구 사항은 여기에 하나의 힙 유형 변수가 있어야하며 힙 유형 변수에는 여러 힙 노드가 있어야합니다.

가변 힙 타입이 I 상기 부호 H에서

int i; 

    FILE *f = stdout; 
    fprintf(f, "Printing heap\n"); 

    for (i=0; i<h->n; i++) { 
    fprintf(f, "[%4d]: n = %5d, c = %17.12lg\n", i, h->d[i].n, h->d[i].c); 
    } 

힙 소자를 인쇄 C 코드 아래 표시이 시연 H-> N

여기서 더미 변수 H 힙 노드의 수는 우리는 D> H-로서 힙 노드 변수 액세스 볼 수있다 [I]

제가

void *vspace, *oldvspace; 

    heap *h /* heap */ 
    heapnode *d; /* heap node */ 


    h->n = 0; 
    h->sz = 8; 

    oldvspace = (void *) h; 
    vspace = (void *)(h + 1);/* address of next node */ 

    d = (heapnode *)vspace;/*point heapnode to above address */ 
    h->d = d;/*assign heapnode to new node */ 
012 이하이 힙 변수 노드를 생성하는 C 코드 표시

우리가 위에서 볼 수있는 것은 특정 메모리 위치에 변수 (이번에는 힙 노드)를 만들고 그 포인터 변수를 가리키는 것입니다.

내가 알고 싶은 것은, 우리가 어떻게 fortran을 사용하여 이것을 할 수 있는지. 이 일을 할 수있는 힌트를 좀주세요.

+0

제목은 일부 기능에 대한 것입니다. 어디 있니? 더 나은 제목에 대해 생각해보십시오. –

+0

또한 어떻게해야 할지를 알지도 모르는 사람들이 C를 모른다는 사실에 대해 생각해보십시오. 배열을 만들고 포인터를 피해야한다고 생각합니다. –

답변

0

포인터 계산은 표준 포트란에서 사용할 수 없습니다. 그러나 컴파일러에는 'Cray 포인터'라고하는 비표준 확장이있어 제한된 포인터 연산을 허용합니다. Cray 포인터 산술은 C 스타일 포인터 산술과 동일하지 않습니다. Cray 포인터를 사용하여 파생 된 유형에 대한 포인터를 증가 시키면 원래 메모리 위치와 파생 된 유형을 저장하는 데 필요한 바이트 수를 더한 포인터 값이 생성되지 않습니다 . 따라서 vspace = (void *)(h + 1); 같은 문장은 정확히 에뮬레이션 될 수 없습니다. 코드를 이식 할 수있게하려면 Cray 포인터를 사용하지 않는 것이 좋습니다.

+0

OP는 이미'integer * 4'와'real * 8' 표준 포트란에서 벗어났습니다. 그러나 나는 동의합니다. Cray 포인터가 더 나쁩니다. –

+0

그러나, 나는 단순한 배열을 사용할 수 있다고 생각한다. Unortunately는 OP가 명확히하지 않을 것이라고 생각한다. 기능을 변환하려고하지만 기능은 없습니다. –

+0

간단한 배열을 사용하는 것이 훨씬 낫다는 것에 동의합니다. –