我正在尝试为简单的编译器构建FSM 我选择创建一个固定大小的数组,其中包含指向状态的接口指针。通过一个简单的占位符FSM读取HTML,这个概念被证明是成功的 但是,真正的FSM将不起作用:在调用状态处理方法时,我得到分段错误(在0x0处)。
这是实例:
this->states[0] = new State0();
this->states[1] = new State1();
this->states[2] = new State2();
this->states[3] = new State3();
this->states[4] = new State4();
[...]
当我单步执行它时,我会在每次分配后看到相应的地址发生变化。
数组以这种方式定义:
#define STATE_COUNT 17
[...]
IState * states[STATE_COUNT];
即将状态置:
class IState {
public:
virtual ~IState() {};
virtual int getNextState(char) = 0;
virtual bool isFinal() = 0;
virtual TokenType getTokenType() = 0;
};
State0,代码最小化以用于测试目的:
class State0 : public IState
{
public:
virtual ~State0();
int getNextState(char c)
{
return 0;
}
bool isFinal()
{
return this->final;
}
TokenType getTokenType()
{
return this->tokenType;
}
private:
TokenType tokenType;
bool final;
};
现在,以下代码行导致SEGFAULT:
this->nextState = this->states[currentState]->getNextState(c);
currentState
为0,因为它在第一次调用时发生。
所以,我认为它既不是范围问题也不是NULL指针。除了状态对象中的NULL指针?
答案 0 :(得分:0)
正如评论中所提到的,这个问题是由于我自己的疏忽造成的。我编辑了我的Makefile来构建其他对象,但未能在我的代码中将标题更改为新的标题。所以我将(“外部”类似的)新目标文件链接到仍使用旧标题的其他代码。