2016-06-18 1 views
-1

私はFortranコードで呼び出されるC関数(store_mode_ - file_A.cで定義されています)を持っています。ポインタを引数として渡すことなく、別の.cで定義された関数で、ある.cファイルで定義された構造体をどのように埋めるか?

それはこのようになります。..

// Create a global structure to populate with current mode frequencies 
struct minos_modes current_modes; 
static int nmode = 0; 

void 
store_mode_(int *n, int *l, double *w, double *U) 
{ 
    if (nmode == MODE_MAX) 
    { 
     printf("[ store_mode_ ] Error: MODE_MAX is too small\n"); 
     exit(1); 
    } 
    current_modes.mode_n[nmode] = *n; 
    current_modes.mode_l[nmode] = *l; 
    current_modes.mode_w[nmode] = *w; 
    current_modes.mode_U[nmode] = *U; 
    nmode += 1; 
    current_modes.len = nmode; 
} 

私はFortranの呼び出しの引数として渡された値(N、L、U、W)との構造を埋めるためにしようとしています。上記のコードは、File_B.c内のmainのすぐ上に定義されているときに動作し、その中のfortranコードを呼び出します。

しかし、上記の関数をfile_A.c(mainが入っていない関数)で定義しても機能しません。私はこれが.cファイル間の共有グローバルがないことに感謝します。私はそこに解決策があるのだろうかと思っていたのですか? おそらくエクスターナルでは、私は少しでも成功しましたが。

+2

"*動作しません*"は問題の説明ではありません。これは明示的にゼロに初期化する必要はありません。 – melpomene

+0

ヘッダーファイルのこれらのシンボルを定義して定義しますか?コンパイル時にコンパイラはstore_modeシンボルがあることを知る必要があります。リンク時にオブジェクトファイルに参加します。これらのシンボルの定義をバイナリに提供します – kirinthos

+0

構造がどこに定義されているかを知る必要があります。そのファイルを実行可能ファイルにリンクする必要があります。他のファイルには、構造体を宣言してアクセスするヘッダを含めることができます。ヘッダには 'extern struct minos_modes current_modes;'のようなものが含まれていなければなりません。構造体定義の詳細も知っておく必要があります。構造体を定義するファイルには、コンパイラがクロスチェックを行うためのヘッダーも含める必要があります。 –

答えて

1
static int nmode = 0; 

あなたは両方のファイルでその行を含めている場合は、2つのnmodeの変数は、各ファイルの1を持っています。 staticは、シンボルを翻訳単位にプライベートにします。

代わりに、あなたはおそらく1つのファイルに

int nmode; 

、およびその他における

extern int nmode; 

をしたいです。

関連する問題