2012-03-23 1 views
1

C++ 메인 프로그램에서 Fortran 90 코드를 호출하려고합니다. Fortran 서브 루틴은 double (X라고 함) 배열을 매개 변수로 사용하여 코드의 여러 위치에서 크기 (X)를 사용합니다. 나는Fortran90과 C++로 생성 된 배열의 크기

double *x = new double[21] 

을 통해 생성 된 C 배열로 루틴을 호출하지만 포트란 코드 크기 (X)의 결과를 인쇄 할 때 나는 837,511,505, 또는 다른 큰 숫자를 얻을.

지금은 포트란 코드를 수정할 수 있으므로 최악의 경우 매개 변수로 크기를 전달하여 함수를 다시 작성하는 것입니다. 그러나 나는 그것을하지 않을 것입니다.

Fortran 루틴이 크기를 알아낼 수있는 방법으로 C 배열을 만들 수있는 방법이 있다면 누구에게 알 수 있습니까?

+0

박쥐를 제외하고, 아마 Fortran은 당신이 건네주고있는 포인터에 비례하여 배열의 크기가 메모리 어딘가에 저장되어있을 것이라고 예상하지만, C++은 그것을 강요하지 않습니다. –

답변

1

구현 관련 기능입니다. 많은 구현 (예 : RSX 및 OpenVMS)은 데이터에 대한 포인터와 차원, 유형 등의 설명을 전달하기위한 구조를 정의합니다. 외부 선언이 명시 적으로 설명자. 대부분의 다른 사람들은 그러한 메커니즘을 제공하지 않습니다. 사용하는 구현 모른 채

:

A) 컴파일러의 설명서
B)를 읽고는, 컴파일러가 어셈블리를 생성, 그리고 그것이

+0

답장을 보내 주셔서 감사합니다. intel과 gnu 컴파일러를 사용할 가능성이 있으며, 프로젝트의 사소한 부분에 대해서만 가능합니다. Fortran 코드를 사용하여 끝내면 아마 주위에 래퍼를 작성할 것입니다. – Alain

0

인텔 F95가 배열 설명 구조를 사용하여 무엇을 기대 확인 검사 배열 포인터를 제외하고는 경계 및 치수 정보도 저장합니다. size()는 디스크립터로부터 정보를 얻는다.

C 전용 포인터에서 전달하므로 설명자 정보를 사용할 수 없으므로 size()는 횡설수설을 반환합니다.

일반적으로 배열과 구조는 종종 프로그래머의 고통 인 혼합 언어 프로그래밍의 거친 영역에 있습니다. 인텔 컴파일러 사용자 문서에는 C < => F95 혼합 호출에 대한 별도 섹션이 있습니다.

특히 인터페이스 및 바인딩 - 언어 간 호출에 도움이되는 멋진 F95 기능을 확인하십시오.

일단 컨벤션을 준수하면 좋은 소식, C < => F95 전화가 잘 작동합니다.

0

나는 개인적으로 C++에서 fortran 90/95/2003까지 혼합 코딩 톤을 사용합니다. 일반적으로 gfortran을 제 컴파일러로 사용하지만이 문제를 피하기 위해 배열의 크기를 항상 보내는 것이 일반적입니다. 심지어 모양을 변경할 수 있습니다.

double* x = new double[2*21] 

real(8),intent(in),dimension(2,21)::x 

이것은 매우 편리한 기능이며 다음 크기 명령을 사용 할 수 있습니다 : 2 차원 배열을 포함하는 X, Y 점을 고려하십시오. 컴파일러 세부 사항에 대한 대답은 정확합니다. 대부분의 컴파일러에서 코드를 사용할 수있게하려면 다중 언어 인터페이스를 사용할 때 길이를 지정해야합니다.