[C++] 328 BBS閲覧アプリの製作 その14 Fl_Tableの行番号取得 user_data メモリアドレス確認

[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]

Fl_Tableに設定したFl_Buttonに行番号を仕込み、クリック時に取り出せるようにしました。

初めはクリックしたボタンのラベル(スレッドタイトル)からスレッドIDを検索していたのですが、重複スレッドがある場合は検索結果がおかしくなるため、行番号でスレッドIDを検索するようにしました。

この実装がかなり難航しました。いよいよLLDBデバッガの出番かという手前で何とか解決させました。

行番号をメモリに格納させたまではよかったのですが、コールバック関数の方で正しいメモリアドレスを受け取れていませんでした。

検証方法を書き留めておきます。

void WidgetTable::SetSize(int newrows, int newcols) {
    <略>
    // 行番号rをuserDataとしてメモリに格納しFl_Buttonに紐付ける
    int* userData = new int(r);
    int rowPos = *static_cast<int*>(userData);
    cout << "rowPos: " << rowPos << " userData: " << userData << endl;

    Fl_Button *btn = new Fl_Button(X,Y,W,H);
    btn->user_data((void*)userData);
    btn->callback(button_cb);

// コールバック関数でメモリアドレスと行番号を確認
void button_cb(Fl_Widget *w, void* userData) {
    int rowPos = *static_cast<int*>(userData);
    cout << "userData: " << userData << endl;
    cout << "rowPos: " << rowPos << endl;
// userDataを正常に渡せた場合 : クリックした行番号9のメモリアドレスが一致している

rowPos: 0 userData: 0x6000015c1fa0
rowPos: 1 userData: 0x6000015c25f0
rowPos: 2 userData: 0x6000015c1fb0
rowPos: 3 userData: 0x6000015c2060
rowPos: 4 userData: 0x6000015c1fc0
rowPos: 5 userData: 0x6000015c2070
rowPos: 6 userData: 0x6000015c20c0
rowPos: 7 userData: 0x6000015c2160
rowPos: 8 userData: 0x6000015c2110
rowPos: 9 userData: 0x6000015c20d0 <-
rowPos: 10 userData: 0x6000015c21b0

// ボタンをクリック時(コールバック関数実行)
userData: 0x6000015c20d0 <- メモリアドレスが一致
rowPos: 9