0

C ++で記述されたコードがあり、ラップトップでコンパイルすると結果が表示されますが、コードをコンパイルしてRPIで実行しようとすると、エラーが発生します。

セグメンテーション違反

プログラムの仕組み(現在):

  • (.wav)ファイルをdoubleのベクトル( "rawData")に読み込みます
  • rawDataをブロックに分割します(ブロックされます)

データをブロックに分割しようとすると、セグメンテーション違反が発生します。サイズ:

rawData-57884ブロック-112800

これで、RPIの容量が256MBしかないことがわかりました。これが問題である可能性があります。または、データを適切に処理していません。物事がどのように実行されているかを示すために、いくつかのコードも含めました。

(main.cpp):

int main()
{
int N = 600;
int M = 200;

float sumthresh = 0.035;
float zerocorssthres = 0.060;

Wav sampleWave;

if(!sampleWave.readAudio("repositry/example.wav", DOUBLE))
{
    cout << "Cannot open the file BOOM";

}

// Return the data
vector<double> rawData = sampleWave.returnRaw();
// THIS segments (typedef vector<double> iniMatrix;)
vector<iniMatrix> blockked = sampleWave.something(rawData, N, M);


cout << rawData.size();

return EXIT_SUCCESS;   
}

(機能:何か)

int n = theData.size();
int maxblockstart = n - N;
int lastblockstart = maxblockstart - (maxblockstart % M);

int numblocks = (lastblockstart)/M + 1;
vector< vector<double> > subBlock;
vector<double> temp;
this->width = N;
this->height = numblocks;

subBlock.resize(600*187);
for(int i=0; (i < 600); i++)
{
    subBlock.push_back(vector<double>());
    for(int j=0; (j < 187); j++)
    {   
        subBlock[i].push_back(theData[i*N+j]);
    } 
}    
return subBlock;

任意の提案をいただければ幸いです:)!うまくいけば、これは十分な説明です。

4

1 に答える 1

2

おそらくどこかで配列をオーバーランしているでしょう(おそらくあなたが投稿したコードでもそうではありません)。ブロッキングで何をしようとしているのかよくわかりませんが、Waveファイルを600のサンプルチャンクに分割したいと思いますか?

もしそうなら、私はあなたが次のようなものが欲しいと思います:

std::vector<std::vector<double>>
SimpleWav::something(const std::vector<double>& data, int N) {

    //How many blocks of size N can we get?
    int num_blocks = data.size() / N;

    //Create the vector with enough empty slots for num_blocks blocks
    std::vector<std::vector<double>> blocked(num_blocks);

    //Loop over all the blocks
    for(int i = 0; i < num_blocks; i++) {
        //Resize the inner vector to fit this block            
        blocked[i].resize(N);

        //Pull each sample for this block
        for(int j = 0; j < N; j++) {
            blocked[i][j] = data[i*N + j];
        }
    }

    return blocked;
}
于 2012-10-15T19:51:13.870 に答える