«данные» не были объявлены в этой области

0

Я выполняю алгоритм Goertzel в C++, и я до сих пор понял:

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

const double pi = 3.14159;

class digitalFilter{
    private:
        int     k,i;
        float   temp;
        float   scalingFactor;
        float   floatnumSamples;
        float   omega,sine,cosine,coeff,q0,q1,q2,magnitude,real,imag;
        int const static limit = 205;
    public:
        digitalFilter();
        void readDataFromFile();
        float goertzel_mag(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data);
};

digitalFilter::digitalFilter(){
    float* data = new float[limit];
}

void digitalFilter::readDataFromFile(){
    //get 205 values from txt file and store this in an array
    std::ifstream dataFile ("data_files/datad.txt");
    if (dataFile.is_open()){
        for (int i = 0; i < limit; i++){
            dataFile >> temp;
            data[i] = temp;
        }
        dataFile.close();
    }else{
        std::cout << "Unable to open file\n";
    }
}

float digitalFilter::goertzel_mag(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data){
    scalingFactor = numSamples / 2.0;

    floatnumSamples = (float) numSamples;
    k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
    omega = (2.0 * pi * k) / floatnumSamples;
    sine = sin(omega);
    cosine = cos(omega);
    coeff = 2.0 * cosine;
    q0=0;
    q1=0;
    q2=0;

    for(int i = 0; i < numSamples; i++)
    {
        q0 = coeff * q1 - q2 + data[i];
        q2 = q1;
        q1 = q0;
    }

    // calculate the real and imaginary results
    // scaling appropriately
    real = (q1 - q2 * cosine) / scalingFactor;
    imag = (q2 * sine) / scalingFactor;

    magnitude = sqrtf(real*real + imag*imag);
    std::cout << "a" << TARGET_FREQUENCY << " = " << magnitude << std::endl;
    return magnitude;
}


int main()
{
    digitalFilter ObjOne;
    //compute amplitude magnitude of DFT
    ObjOne.readDataFromFile();
    ObjOne.goertzel_mag(205,697,8000,data);
    ObjOne.goertzel_mag(205,770,8000,data);
    ObjOne.goertzel_mag(205,852,8000,data);
    ObjOne.goertzel_mag(205,941,8000,data);
    ObjOne.goertzel_mag(205,1209,8000,data);
    ObjOne.goertzel_mag(205,1336,8000,data);
    ObjOne.goertzel_mag(205,1477,8000,data);
    ObjOne.goertzel_mag(205,1633,8000,data);

    return 0;
}

Но я получаю эти глупые коды ошибок:

goertzel_mag-v3.cpp: In member function 'void digitalFilter::readDataFromFile()':
goertzel_mag-v3.cpp:41:4: error: 'data' was not declared in this scope
goertzel_mag-v3.cpp: In function 'int main()':
goertzel_mag-v3.cpp:85:35: error: 'data' was not declared in this scope

Я полностью и полностью потерял, почему моя функция-член readDataFromFile() находит мои data[] массива data[]?? Кажется, что конструктор строит массив, а затем уничтожает его после того, как программа покидает конструктор? Как я могу исправить эти, по-видимому, глупые ошибки?

Теги:
arrays
constructor
destructor
goertzel-algorithm

2 ответа

4
Лучший ответ
digitalFilter::digitalFilter(){
    float* data = new float[limit];
}

После выхода из функции конструктора массив data перестает существовать. Сделайте его переменной-членом класса или глобальной, чтобы сохранить ее.

  • 0
    Да, он работает как глобальный, но не как переменная члена класса, как я использую его в своей основной.
  • 0
    Хорошо, что бы ни отвечало вашим потребностям - вы можете использовать это, если это переменная-член в основной функции от средства доступа. Хотя вам не нужно передавать его функциям-членам, поскольку они имеют прямой доступ к ним.
0

Инициализация данных float * в качестве функции-члена фиксирует первую проблему. поскольку он инициализируется в конструкторе и будет доступен только для этого блока и выходит за рамки

Для основной части обращайтесь к нему с помощью объекта, как только вы сделаете его функцией-членом. например: obj.data

  • 0
    float *data не являются функцией-членом. Кроме того, доступ к нему в main() возможен, зависит от того, является ли он public или private
  • 0
    @Kunal именно поэтому я спросил его, чтобы сделать его членом данных, и публично, потому что он снова вызывает его в основном

Ещё вопросы

Сообщество Overcoder
Наверх
Меню