2011-06-29 9 views
0

を使用してバイナリファイルに書き込む際に、一貫した「アクセス違反の読み取り場所」で、一部の入力データのFFTを取得するコードを修正しようとしています。変換はすべてうまくいく。fstream

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行目で一貫して発生しているようです(おそらくそれは役に立ちますか?)。

本当に私を捨てているのは、一見無作為であることです。これが初めてこの問題に遭遇したので、どこからバグを探し始めるか分かりません。この例外に関する他の投稿に基づいて、ポインタの使用に問題があると思われますか?

解決方法やバグの処理方法についての助けをいただければ幸いです。 outFile.write((char*) &F, length * sizeof(float));

私が何をしたいことだと思う:

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

あなたはポインタのアドレスから始まるメモリをダンプする

は、私は、問題はここにあると信じて、 グレッグ

答えて

2

をありがとう、ポインタに格納されているアドレスではありません。これらの2つのアドレスがメモリ内で適切な関係にあれば、ファイル内のデータの一部が間違っていますが、書き込みは機能します。しかし、その行動は予測不可能であり、クラッシュを引き起こす可能性があります。私があなただったら

することは、私はからアプリケーション検証ツールをダウンロードしてみてください、あなたは、Windowsのボックスにしているので

+0

ありがとうございました、それはそれを修正したようです。 – GregD

+0

もっと堅牢なファイル形式に関するもう1つのコメント。どういう意味ですか?何をお勧めしますか?再度、感謝します。 – GregD

+0

メモリをダンプすると、異なるアーキテクチャー(または異なるコンパイラー...)のマシンに移植できない形式になります。出力時にデータをフォーマットする必要があります(単純な.csv形式を生成するためにstdoutを使用することも良いでしょう) – antlersoft

1

array--あなたの出力を表すメモリのダンプよりも堅牢であるファイル形式について思うだろうMSDN。 (申し訳ありません、私のWP7からこれをタイプするので、私はリンクを手元に持っていません)。ページヒープと基本チェックを有効にすると、問題を正確に突き止めることができます。