2012-05-04 7 views
-1

私はWidgetVisualization.hのクラスWidgetVisualizationに関数ポインタvoid (*Draw)(WidgetVisualization *);を持っています。多分誰かが見逃しているものを見ることができます(デバッグケース、C++、関数ポインタ)

私はextern void GraphicVisualizationDraw(WidgetVisualization *w)をWidgetVisualization.cppに持っています。

WidgetVisualizationのコンストラクタでは、Draw = GraphicVisualizationDraw;を割り当てています。

そして、ここLCDGraphic.cppから関数です:

void GraphicVisualizationDraw(WidgetVisualization *widget) { 

} 

私は関数ポインタは、私は、無効な書き込みを取得し、機能GraphicVisualizationDrawに「引く」割り当てよう。どんな手掛かり?

ここでvalgrindの出力です:

==8281== Invalid write of size 4 
==8281== at 0x52D12C7: LCD::WidgetVisualization::WidgetVisualization(LCD::LCDCore*, std::string, Json::Value*, int, int, int) (WidgetVisualization.cpp:72) 
==8281== by 0x530F0C3: LCD::LCDCore::BuildLayouts() (LCDCore.cpp:342) 
==8281== by 0x5306A07: LCD::LCDControl::ConfigSetup() (LCDControl.cpp:213) 
==8281== by 0x53062EC: LCD::LCDControl::Start() (LCDControl.cpp:57) 
==8281== by 0x52D84E4: (anonymous namespace)::lcdcontrol_init(_VisPluginData*) (actor_lcdcontrol.cpp:115) 
==8281== by 0x40645FA: visual_plugin_realize (lv_plugin.cpp:207) 
==8281== by 0x405B1E7: visual_actor_realize (lv_actor.cpp:265) 
==8281== by 0x404C02B: visual_bin_realize (lv_bin.c:108) 
==8281== by 0x80507D1: main (lv-tool.cpp:378) 


WidgetVisualization::WidgetVisualization(LCDCore *v, std::string n, Json::Value *section, int row, int col, int layer) : Widget(v, n, section, row, col, layer, 
    WIDGET_TYPE_VISUALIZATION | WIDGET_TYPE_RC | WIDGET_TYPE_SPECIAL) { 

    LCDError("widgetvisualization: layer: %d", layer_); 

    if(lcd_type_ == LCD_TEXT) 
     Draw = TextVisualizationDraw; 
    else if(lcd_type_ == LCD_GRAPHIC) 
     Draw = GraphicVisualizationDraw;// line 72 
    else 
     Draw = 0; 
+1

書き込みが無効ですか?あなたはコンパイル時やランタイムエラーについて話していますか?特定のエラーを貼り付けることはできますか?あなたが記述したクラスの関連部分を貼り付けることはできますか? – Baltasarq

+1

valgrindから出力されます。私はちょうどそれを追加した。 – Scott

+0

私はいくつかのコードを追加しました。 – Scott

答えて

0

このエラーは、クラス自体のコードでやっていないようだ、WidgetVisualizationクラスの中のオブジェクトのメモリ位置に関連したものになるようです創造された。

問題は、Drawの初期化を実行すると、オブジェクトが不正な位置にあることをランタイムが認識してしまうことです。

スタックトレース後:BuildLayouts()呼ば

==8281== Invalid write of size 4 
==8281== at 0x52D12C7: LCD::WidgetVisualization::WidgetVisualization(LCD::LCDCore*, std::string, Json::Value*, int, int, int) (WidgetVisualization.cpp:72) 
==8281== by 0x530F0C3: LCD::LCDCore::BuildLayouts() (LCDCore.cpp:342) 

メンバ関数は、このオブジェクトの悪い配分を行っている一つとして有力な候補であるように思われます。そのコードを再確認する必要があります。

関連する問題