私は単純なコンパイラのためのFSMを構築しようとしています。
ステートへのインターフェイスポインタを持つ固定サイズの配列を作成することを選択しました。この概念は、HTMLを読み取る単純なプレースホルダFSMで成功したことが判明しました。
しかし、実際の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();
[...]
私はそれをステップ実行すると、私は各割り当ての後に変更し、対応するアドレスを見ることができます。
アレイは、このように定義され:
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;
};
次に、次のコード行:テスト目的のために最小限のコードと、
class IState {
public:
virtual ~IState() {};
virtual int getNextState(char) = 0;
virtual bool isFinal() = 0;
virtual TokenType getTokenType() = 0;
};
STATE0:
#define STATE_COUNT 17
[...]
IState * states[STATE_COUNT];
ISTATEをSEGFAULTが発生します。
this->nextState = this->states[currentState]->getNextState(c);
currentState
は、最初の呼び出しで発生するため、0です。
だから、スコープの問題でもNULLポインタでもないと思います。 NULLを除いて、このオブジェクトオブジェクトのポインタ?
本当に 'currentState'は' 0'ですか?電話の前に印刷しましたか? –
私は踏み込んだので、はい。しかし、私はその間に問題を特定しました。オブジェクトファイルを切り替えたときにインクルードされたヘッダーを切り替えるのを忘れました。 D: –
残念ながら非常に一般的なエラーです。経験豊富なプログラマーの間でさえ、私はあなたに保証することができます! –