该计划给了我一个segmentation fault。我该如何解决这个问题?
我有makefile
,fir_filter.cpp
,fir_filter_mod.cpp
,fir_filter.h
,fir_filter_mod.h
和testbench.cpp
。基本上我使用testbench检查fir_filter.cpp
和fir_filter_mod.cpp
之间的结果。
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
#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
void fir_filter(double *x, double *y);
#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;
}
#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;
}
double fir_filter_mod(double *x);
#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;
}
}
}
答案 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
命令查看堆栈跟踪。