【问题标题】:Data Management Error C++数据管理错误 C++
【发布时间】:2018-03-16 14:02:39
【问题描述】:

我的代码有问题。问题是即使我的程序一直运行,它仍然在最后崩溃。我的 IDE 没有给我任何反对意见,也没有任何迹象表明我的程序为什么最终会失败,所以我被引导相信有什么东西越界或什么东西弄乱了我的堆栈。我查看了我的代码,似乎没有什么超出范围,所以我对这件事完全感到困惑。

我正在使用我创建的头文件、包含头文件中的函数的文件和主方法文件。该错误是由包含我的函数的文件引起的。

我班级的领域是 大小 - 整数

低 - 整数

高 - 整数

windowSize - 整数

*filteredArray - int

数组[] - 整数

这是头文件:

#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_ */

代码如下:

#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;
}

【问题讨论】:

  • 如何分配array?特别是new int[..what size..?] 行。
  • 如果你能总结一下代码应该做什么,那就太好了。
  • 我检查了代码,发现我实际上并没有分配它......但是它仍然有效。
  • 这段代码应该创建一个大小为 25-50 的随机数组,随机设置高低值,然后对其运行汉宁过滤器以创建过滤后的数组。
  • “我实际上根本没有分配它”——好吧,这就是你的问题! “但它仍然有效” - 这只是运气(我称之为厄运),除了最后的悬挂位。

标签: c++ arrays loops memory-management


【解决方案1】:

你没有为你的数组分配内存:

int array[];

当你像这样索引它时:

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

您调用未定义的行为,因为您超出了界限(例如,您请求第一个元素,但来自一个未知大小的数组)。

您可以声明具有固定大小的数组,例如:

int array[100];

但是,由于这是 C++,请考虑使用 std::vector。一个直接的优势是您不必为静态分配的数组硬编码大小,但您可以依靠向量在数据插入/推入时调整大小的能力。

【讨论】:

  • 或者,因为它是 C++,所以使用 std::vector array;
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多