私は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ファイル間の共有グローバルがないことに感謝します。私はそこに解決策があるのだろうかと思っていたのですか? おそらくエクスターナルでは、私は少しでも成功しましたが。
"*動作しません*"は問題の説明ではありません。これは明示的にゼロに初期化する必要はありません。 – melpomene
ヘッダーファイルのこれらのシンボルを定義して定義しますか?コンパイル時にコンパイラはstore_modeシンボルがあることを知る必要があります。リンク時にオブジェクトファイルに参加します。これらのシンボルの定義をバイナリに提供します – kirinthos
構造がどこに定義されているかを知る必要があります。そのファイルを実行可能ファイルにリンクする必要があります。他のファイルには、構造体を宣言してアクセスするヘッダを含めることができます。ヘッダには 'extern struct minos_modes current_modes;'のようなものが含まれていなければなりません。構造体定義の詳細も知っておく必要があります。構造体を定義するファイルには、コンパイラがクロスチェックを行うためのヘッダーも含める必要があります。 –