2

C++ から Fortran 共通ブロック構造内の配列にアクセスしようとしています。
C++ と Fortran の混合サンプル コードがあります。

フォートラン:

integer a(5),b  
common  /sample/ a,b  
a(1) = 1  
a(2) = 5  
a(3) = 10  
a(4) = 15  
a(5) = 20  
b = 25  

次にC++で:

extern "C"{  
    extern struct{  
        int *a,b;  
}sample_;  

C++ から、値を出力しようとするとsample_.b:

printf("sample b:%d\n",sample_.b);

a(2) の値を取得します:sample b:5

そして、他の配列の値を印刷しようとすると、セグメンテーション違反が発生します...

printf("sample_.a[1]=%d\n",(int)sample_.a[1]);  
printf("sample_.a[0]=%d\n",(int)sample_.a[0]);

私は何を間違っていますか?¿任意のアイデア¿?
おそらく、配列「a」の長さもC++に渡す必要があると思いますが、そうであれば、その方法もわかりません。

4

5 に答える 5

3

あなたのFORTRANデータが実際に次のようにレイアウトされているように見えます

struct {
  int a[5];
  int b;
}

そして、あなたはマシン上にいsizeof(int) == sizeof(int*)ます.

于 2012-05-07T13:03:56.240 に答える
2

私の Fortran は少し (OK、かなり) 錆びていますが、ちょっと試してみましょう。

aおそらく、ポインターではなく VALUE を受け取りました。これ1は、適切なポインター値ではありません。

bデータ ブロックの 2 番目の値を受け取りました。あなたの C++ 構造体は、データの実際の形式が何であるかをコンパイラに示しません。データ ブロックへのポインターを取得し、手動で逆アセンブルします。

aデータ ブロックの ADDRESS に割り当てます (long intポインタとして、次のように見えます。マイレージは異なる場合があります) b = a[5]。それが役立つことを願っています。

于 2012-05-07T12:36:15.750 に答える
0

適切な C++/Fortran コードの場合、少なくとも Fortran 2003 を使用する必要があります。古い Fortran コード (Fortran 77 の場合でも) 用の Fortran 2003/2008 インターフェイスを作成するのは、実際には非常に簡単です。

最新の Fortran と C++ の混合に関する投稿へのリンクを次に示します。

http://solarianprogrammer.com/2012/05/11/mixed-language-programming-cpp-11-fortran-2008/

于 2012-05-11T16:43:17.833 に答える
0

有益な回答をありがとうございました。あなたのアドバイスに従って、私はついに自分の問題が何であるかを理解しました. 私の間違いは、Fortranで次のことをしたことだと思います:

integer a(5),b  
common  /sample/ a,b  

a(5)固定サイズで、次に C++ で:

extern "C"{  
    extern struct{  
        int *a,b;  
}sample_;  

*aサイズなし、ポインターとして。したがって、コンパイラはこのように、配列*intではなくポインタとして理解していましたa(5)

于 2012-05-09T08:19:13.707 に答える