2

私はコンピュータ サイエンスの 1 年生で、ランダムに割り当てられた float の配列をバブル ソートし、バイナリ チョップ検索を使用して配列の最後の要素の値を見つける C++ プログラムを作成しています (コードのタイミングを合わせる際の一貫性のため)。

バブル ソートとバイナリ チョップ検索の実行時間を計りたいのですが、C++ 標準時間ライブラリでは 2 番目のレベルの精度しか得られず、このコードはほとんどの場合 1 秒未満で実行されるため使用できません。

Boost を見つけました。Boost DateTime ライブラリのマイクロ秒クロックを使用して、コード実行のサブ秒精度のタイミングを取得する方法としてそれを使用しようとしています。私が使用しているコードはhttp://pastebin.com/U8D0s2hbにあります。このコードを実行すると、Visual Studio 2008 から次のエラーが発生します。

実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。

犯人は時間を ptime オブジェクトとして取得しているように見えますが、これまでランタイム チェックの失敗エラーを見たことがないため、その理由はわかりません。

助けていただければ幸いです。

4

2 に答える 2

1

これは呼び出し規約の問題のように見えますが、実際には構造体メンバーのアラインメントの問題のようです。

クライアント コードでは、既定の構造体メンバーの配置を使用する必要があります。プロジェクトのプロパティで、 を選択し、Configuration Propertiesオプションが に設定されていることを確認します。C/C++Code GenerationStructure Member AlignmentDefault

この問題に関する別の質問については、こちらを参照してください。

于 2010-12-11T06:20:06.653 に答える
0

boost.thread でも同じ問題がありました。

変更履歴を追跡したところ、ヘッダー < windows.h > を < boost/thread.hpp > の前に追加したことがわかりました。おそらくwindows.hヘッダーがboost/thread.hppを混乱させるいくつかの呼び出し規約を定義しているのではないかと思ったので、boost/thread.hppの後にwindows.hファイルを配置すると、問題はなくなりました。

お役に立てれば。

于 2013-07-26T15:58:21.243 に答える