0

一部の入力データの FFT を取得するためにコードを適応させようとしています。変換を行うと、すべてがうまくいきます。トランスフォームをバイナリ ファイルに書き込もうとすると、次のような問題が発生します。

FFT.exe の 0x68d0ca24 (msvcr100d.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00161000。

最も奇妙なことは、プログラムをコンパイルして実行するたびに発生しないことです。約 3 回ごとに正常に実行され、データがファイルに保存されます。

#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>

#include "dft/FFT.h"
#include "ffft/FFTReal.h"

int main ()
{
    using namespace std;
    const char* dataFile = "C:/users/gad18/documents/temp/testData.dat";
    const char* transformFile = "C:/users/gad18/documents/temp/DFTtestOutput.dat";
    int length;
    off_t size;

    fstream inFile;
inFile.open( dataFile, ios_base::in | ios_base::binary );
if ( ! inFile.is_open() )
{
    cout << "Error opening " << dataFile << " for reading." << endl;
    cout << "Terminating process." << endl;
    cin.get();
    exit( EXIT_FAILURE );
}


cout << "Reading from " << dataFile << endl;
inFile.seekg( 0, ios_base::end );
size = static_cast <off_t> ( inFile.tellg() );
inFile.seekg( 0, ios_base::beg );
length = size / sizeof( float );

float* buffer = new float[ length ];
float* F = new float [length ];

inFile.read( (char*) buffer, length * sizeof( float ) );
inFile.close();

cout << size << " bytes read in." << endl;
cout << length << " float elements read into memory." << endl;

cout << "Press return key to creat DFT object..." << endl;
cin.sync();
cin.get();

cout << "Creating DFT object of length " << length << " points." << endl;

dft::FFT dft_object( length );
ffft::FFTReal<float> ffft_object( length );

int bits_out = dft_object.get_bits();
cout << "Successfully created DFT object with " << bits_out << " bit depth." << endl;

cout << "Press return key to attempt fast Fourier transform of data..." << endl;
cin.sync();
cin.get();

dft_object.compute_FFT( F, buffer );

cout << "Press return key to save transform data..." << endl;
cin.sync();
cin.get();

fstream outFile;
outFile.open( transformFile, ios_base::out | ios_base::trunc | ios_base::binary );
if ( ! outFile.is_open() )
{
    cout << "Error opening " << dataFile << " for writing." << endl;
    cout << "Terminating process." << endl;
    cin.get();
    exit( EXIT_FAILURE );
}
else
{
    outFile.write( (char*) &F, length * sizeof( float ) );
    size = outFile.tellg();
    cout << "Wrote " << size << " bytes to " << transformFile << endl;
    outFile.close();
}

delete [] buffer;
delete [] F;

cout << "Press return key to continue...";
cin.sync();
cin.get();
return 0;
} // int main()

これが質問にコードを含める適切な方法でない場合はお詫びします (最初の投稿はこちら)。

例外は、streambuf の 202 行目で一貫して発生しているようです (これが役立つのでしょうか?)。

本当に私を悩ませているのは、一見ランダムに発生しているように見えることです。この問題に遭遇したのはこれが初めてなので、どこからバグを探し始めればよいのかわからない. この例外に関する他の投稿に基づいて、ポインターの使用に問題があるようです?

解決策や実行中のバグを処理する方法についての助けをいただければ幸いです。

ありがとう、グレッグ

4

2 に答える 2

2

問題はここにあると思います:outFile.write( (char*) &F, length * sizeof( float ) );

あなたが望むのは次のとおりだと思います:

    outFile.write( (char*) F, length * sizeof( float ) );

ポインターに格納されているアドレスではなく、ポインターのアドレスからメモリをダンプしています。これら 2 つのアドレスがメモリ内で正しい関係にある場合、書き込みは機能しますが、ファイル内のデータの一部が正しくありません。しかし、この動作は予測不可能であり、クラッシュを引き起こす可能性があります。

私があなたなら、出力配列を表すメモリのダンプよりも堅牢なファイル形式について考えるでしょう--

于 2011-06-29T20:51:14.233 に答える
1

Windows ボックスを使用しているため、MSDN から Application Verifier をダウンロードしてみてください。(申し訳ありませんが、WP7からこれを入力しているため、リンクが手元にありません)。ページヒープと基本チェックを有効にすると、問題を正確に特定できる場合があります。

于 2011-06-29T21:15:31.590 に答える