1

f2c コンバーター (f2c) を使用して一部のレガシー Fortran コードを C に変換し、Windows 7 (64 ビット) で Visual Studio 10 ソリューションを作成しました。また、C++ プログラム (メイン関数を含む test.cpp) を f2c ライブラリ (システム上で nmake を使用して構築) にリンクする必要もありました。

プログラムは実行されますが、メイン関数の最後に到達すると、次のデバッグ エラーが表示されます。

Stack around the variable 'qq' was corrupted
Stack around the variable 'pf' was corrupted
Stack around the variable 'ampls' was corrupted

これは、変換された C (Fortran から) ファイルで f2c コンバーターによって行われた「修正」によるものではないかと考えています。

/* Parameter adjustments */
--x1;
--xabs;
--ximag;
--xreal;
--work4;
--work3;
--work2;
--work1;
--ampls;
--pf;
--qq;
--tri;

これらの変数はすべて C 配列であるため、これは少し奇妙に思えます。f2c プログラムは、Fortran と同様の方法で、配列のインデックス 0 がインデックス 1 になるようにポインター演算を実行しているだけだと思います。

これが、割り当てられていない配列の要素にアクセスする変換されたコードで何か問題が発生したことが原因である可能性があるかどうかはわかりません。

このエラーをデバッグして修正する最善の方法は何ですか?

4

3 に答える 3

1

考えられる理由:

  • このエラーは通常、配列(動的または静的配列)の境界外への書き込みに関連しています。このエラーは、-veインデックスまたはインデックス>=size_of_arrayに値を書き込んだり取得したりすることで発生する可能性があります。
  • このエラーは、ポインタが正しい位置に設定されていない場合にも発生します。(たとえばptr = 0ptr = 55削除された(解放された、または解放された)メモリ、または無効なアドレスを指す)

私の頭の中でエラーをデバッグする最良の方法は、プログラムを段階的にデバッグし、それらのポインター値を監視することです。それらにいくつかの間違いがあるに違いありません。

于 2012-05-22T16:33:32.687 に答える
1

あなたの言うことは本当かもしれません。配列を使用し、f2c とまったく同じようにポインターをデクリメントする非常に小さなプログラムを作成することをお勧めします。何かのようなもの

int aa[10];
int *pa = aa;
--pa;
pa[1] = ...

つまり、疑わしいコードを小規模でテストします。このようにして、問題の原因を切り分けることができます。(回避策を見つけることは別の話です)

于 2012-05-22T17:33:59.420 に答える
1

crt のデバッグ バージョンでコンパイルしていますか? それはあなたにいくつかのより多くの情報を与えるかもしれません。

また、ライブラリが C としてビルドされ、アプリケーションが C++ として記述されている可能性はありますか?

あなたが言及したこれらのエラーは、呼び出し規約が異なることが原因である場合があります。あなたはそれが64ビットアプリケーションであると述べているので、問題にはならないはずです(すべての64ビットアプリは同じ呼び出し規約を使用しています)が、調べる価値があります.

Fortran に変換されたすべてのコードを Visual Studio に追加し、別の make を実行しないことは可能ですか?

于 2012-05-24T15:23:19.213 に答える