简单C ++程序中的分段错误

时间:2011-08-09 01:39:08

标签: c++ segmentation-fault

该计划给了我一个segmentation fault。我该如何解决这个问题?

我有makefilefir_filter.cppfir_filter_mod.cppfir_filter.hfir_filter_mod.htestbench.cpp。基本上我使用testbench检查fir_filter.cppfir_filter_mod.cpp之间的结果。

文件Makefile:

CAT_HOME = $(MGC_HOME)
TARGET = my_tb
OBJECTS = fir_filter.o fir_filter_mod.o testbench.o
DEPENDS = fir_filter.h fir_filter_mod.h
INCLUDES = -I"$(CAT_HOME)/shared/include"
DEFINES =
CXX = /usr/bin/g++
CXXFLAGS = -g $(DEFINES) $(INCLUDES)

$(TARGET) : $(OBJECTS)
    $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS)

$(OBJECTS) : $(DEPENDS)

# Phony target to remove all objects and executables
.PHONY: clean
clean:
    rm -f *.o my_tb

文件shift_class.h

#ifndef __SHIFT_CLASS__
#define __SHIFT_CLASS__

template<typename dataType, int NUM_REGS>
class shift_class{
    private:
        dataType regs[NUM_REGS];
        bool en;
        bool sync_rst;
        bool ld;
        dataType *load_data;

    public:
        shift_class(): en(true), sync_rst(false), ld(false) {}
        shift_class(dataType din[NUM_REGS]):
            en(true), sync_rst(false), ld(false) {
                load_data = din;
        }
        void set_sync_rst(bool srst) {
            sync_rst = srst;
        }
        void load(bool load_in){
            ld = load_in;
        }
        void set_enable(bool enable) {
            en = enable;
        }

        void operator << (dataType din){
            SHIFT: for(int i = NUM_REGS - 1; i >= 0; i--) {
                if(en)
                    if(sync_rst)
                        regs[i] = 0;
                    else if(ld)
                        regs[i] = load_data[i];
                    else
                        if(i == 0)
                            regs[i] = din;
                        else
                            regs[i] = regs[i - 1];
            }
        }
        dataType operator [] (int i){
            return regs[i];
        }
};
#endif

文件fir_filter.h

void fir_filter(double *x, double *y);

文件fir_filter.cpp

#include "fir_filter.h"
#include "shift_class.h"
void fir_filter(double *x, double *y) {
    const double h[4] = {0.5, 0.5, 0.5, 0.5};
    static shift_class<double, 4> regs;
    double temp = 0;
    regs << *x;
    MAX: for(int i = 0; i < 4; i++) {
        temp += h[i] * regs[i];
    }
    *y = temp;
}

文件fir_filter_mod.cpp

#include "fir_filter_mod.h"
#include "shift_class.h"
double fir_filter_mod(double *x) {
    const double h[4] = {0.5, 0.5, 0.5, 0.5};
    static shift_class<double, 4> regs;
    double y = 0;
    double temp = 0;
    regs << *x;
    MAX: for(int i = 0; i < 4; i++) {
        temp += h[i] * regs[i];
    }
    y = temp;
    return y;
}

文件fir_filter.h

double fir_filter_mod(double *x);

File testbench.cpp

#include <iostream>
#include "fir_filter.h"
#include "fir_filter_mod.h"
using namespace std;

int main()
{
    double *x;
    double *y;
    double y_mod;

    double init = 1;
    x = &init;

    for(int j = 0; j < 5; j++) {
        fir_filter(x, y);
        y_mod = fir_filter_mod(x);
        if(*y == y_mod) {
            cout << "ERROR" << endl;
        }
        else {
            cout << y_mod << endl;
        }
    }
}

4 个答案:

答案 0 :(得分:1)

错误的想法:在程序中为屏幕代码添加大量打印。然后,您可以检查程序中的最后一条消息,并尝试查找发生段错误的位置。您还可以打印调试数据,例如不同变量的值。

好主意:使用调试器。这使得不必要的实施不好的想法。

另一个好主意:尝试对代码进行审核。有很多C ++代码的分析器。他们可以揭示您程序中潜在的危险位置。

错误发生在这个地方:

 if(*y == y_mod) {
        cout << "ERROR" << endl;

在上一步中,您调用了void fir_filter(double *x, double *y)并且它不会更改指针值。但是你没有在程序开始时初始化y。因此,y指向无处,y的解散会导致程序崩溃。

答案 1 :(得分:1)

本部分有一个问题

int main()
{
    double *x;
    double *y;
    double y_mod;

    double init = 1;
    x = &init;

    for(int j = 0; j < 5; j++) {
        fir_filter(x, y);

因为对fir_filter的调用会将结果写入*y,但指针不指向任何位置。

答案 2 :(得分:1)

fir_filter.cpp这一行中的分段错误

*y = temp;

因为y指向无处。

如果您想获得该值,只需返回它或使用参考。

答案 3 :(得分:0)

您需要的是调试器。尝试在gdb中运行程序并查看崩溃发生的位置:

`gdb my_tb`

输入run命令以启动程序运行。发生崩溃时,您可以使用bt命令查看堆栈跟踪。