2017-10-05 15 views
2

私のコードに問題があります。問題は、私のプログラムがすべて実行されても、最後にはクラッシュするということです。私のIDEは私に不満を与えないし、なぜ私のプログラムが最後に失敗しているのかについての指標がないので、何かが外れているとか、何かが私のスタックを台無しにしていると信じられています。私は自分のコードを見てきましたが、何も外れているようには見えないので、私はこの問題について完全に混乱しています。データ管理エラーC++

私が作成したヘッダーファイル、ヘッダーファイルの関数を含むファイル、およびメインメソッドファイルを使用しています。このエラーは、自分の関数を含むファイルの結果です。

が高い値int - -

windowSizeをint型 -

低い値int - 私のクラスの

フィールドは 大きさint型

* filteredArray - int型

配列[] - int

彼女eはヘッダファイルです:

#include "Filter.hpp" 
#include <iostream> 
#include <time.h> 
#include <stdlib.h> 
#include <cmath> 
#include <array> 
#include <string> 
#include <cstring> 
using namespace std; 

// Constructor 
Filter::Filter(int num){ 
    size = ((rand() % 25) + 25); 
    high = ((rand() % 6) + 5); 
    low = ((rand() % 6) + 5) * -1; 
    windowSize = num; 
    randArrayGen(); 
    hanningFilter(); 

} 


void Filter::randArrayGen(){ 
    for(int i = 0; i < size;i++){ 
     array[i] = (rand() % (high + low * -1)) + low; 
    } 
} 




int Filter::hanning(int ar[]){ 
    int weightAvg; 

    if(windowSize == 3){ 
     weightAvg = (ar[0] + ar[1] * 2 +ar[2])/4; 
    } 
    else if(windowSize == 5){ 
     weightAvg = (ar[0] + ar[1] * 2 + ar[2] * 3 + ar[3] * 2 + ar[4])/9; 
    } 
    else if(windowSize == 7){ 
     weightAvg = (ar[0] + ar[1] * 2 + ar[2] * 3 + ar[3] * 4 + ar[4] *3 + ar[5] * 2 + ar[6])/16; 
    } 
    else if(windowSize == 9){ 
      weightAvg = (ar[0] + ar[1] * 2 +ar[2] * 3 + ar[3] * 4 + ar[4] * 5 + ar[5] * 4 + ar[6] * 3 + ar[7] * 2 + ar[8])/25; 
     } 
    else{ 
     weightAvg = 0; 
    } 
    return weightAvg; 
} 



void Filter::hanningFilter(){ 
    filteredArray = new int[size]; 
    for(int i = 0; i < size; i++){ 
     if(i - (windowSize/2) < 0 or i + (windowSize/2) > size - 1){ 
      filteredArray[i] = 0; 
     } 
     else{ 
      filteredArray[i] = hanning(&array[i-(windowSize/2)]); 
     } 
    } 
} 



int Filter::getHigh(){ 
    return high; 
} 

int Filter::getLow(){ 
    return low; 
} 

int Filter::getSize(){ 
    return size; 
} 
+0

どのように 'array'を割り当てますか?具体的には 'new int [.. what size ..? ''行です。 –

+0

コードが何をすべきかの要約を書いた方がいいでしょう。 – Lamar

+0

コードをチェックしたところ、実際には割り当てられていないことがわかりました...しかし、まだ動作しています。 –

答えて

2

あなたの配列にメモリを割り当てません:

:よう

int array[]; 

としたときに、インデックス、それをここで

#ifndef FILTER_HPP_ 
#define FILTER_HPP_ 
#include<iostream> 


class Filter { 
    int size; 
    int high; 
    int low; 
    int windowSize; 
    int *filteredArray; 
    int array[]; 
    public: 
     // Constructor 
     Filter(int windowSize); 
     // Methods 
     void randArrayGen(); 
     int* randArrayGenRecurHelper(int arrayRecur[], int count); 
     void randArrayGenRecur(); 
     void printArrays(); 
     int hanning(int ar[]); 
     void hanningFilter(); 
     void graphicArrays(); 
     int getSize(); 
     int getHigh(); 
     int getLow(); 

}; 





#endif /* FILTER_HPP_ */ 

コードです

for(int i = 0; i < size;i++){ 
    array[i] = (rand() % (high + low * -1)) + low; 
} 

定義されていない動作、あなたは境界から外れています(例えば、最初の要素を要求していますが、未知のサイズの配列から要求しています)。

あなたは、例えば、次のように、固定サイズで配列を宣言できます。これはC++であるので、std::vectorを使用することを検討して

int array[100]; 

。すぐに利用できる利点は、静的に割り当てられた配列のサイズをハードコードする必要はありませんが、データが挿入/挿入される際のベクトルのサイズ変更機能に依存することができます。

+0

あるいは、C++なので、全体を通して 'std :: vector array;'を使います。 –