FLTK Fl_Choice получить выбранный предмет

Я хочу получить выбранный элемент пользователей, но выдает ошибку по этому коду:

choice->value(); 

надеюсь, что вы, добрые ребята, можете мне помочь.

    Fl_Choice*    choice;
    int    i   =   0;

    void but_cb(Fl_Button* obj, void*)
    {
        i = choice->value();
        cout<<i;
    }
    int main (int argc, char* argv[]) {
    Fl_Double_Window* win = new Fl_Double_Window(400,400,"Sample");
    win->begin();
    Fl_Choice* choice = new Fl_Choice(100,100,100,100,"Name");
    choice->add("Peter");
    choice->add("Tom");
    choice->add("Mary");
    Fl_Button* but = new Fl_Button(300,300,50,50,"Selected");
    but->callback((Fl_Callback*)but_cb);
    win->show();
    return (Fl::run());
}

person user3651047    schedule 22.05.2014    source источник


Ответы (1)


Я не тратил много времени на чтение кода, поэтому приведенный ниже модифицированный и прокомментированный код может не решить вашу проблему. Я считаю, что choice имеет значение NULL в but_cb(), поскольку вы переопределяете выбор в своей функции main(), скрывая глобальный указатель выбора.

Fl_Choice* choice;
int i = 0;

void but_cb(Fl_Button* obj, void*) {
    i = choice->value(); // uses global `choice` pointer to Fl_Choice.
    cout << i;
}

int main (int argc, char* argv[]) {
    Fl_Double_Window* win = new Fl_Double_Window(400,400,"Sample");
    win->begin();
        /* You are redefining choice here! BAD, because but_cb uses the global one.
        Fl_Choice* choice = new Fl_Choice(100,100,100,100,"Name");
        */

        // Good, assigns to the global `choice`, so it won't be NULL when but_cb is called
        choice = new Fl_Choice(100,100,100,100,"Name"); 

        choice->add("Peter");
        choice->add("Tom");
        choice->add("Mary");
        Fl_Button* but = new Fl_Button(300,300,50,50,"Selected");
        but->callback((Fl_Callback*)but_cb);
    win->show();
    return (Fl::run());
}
person DejanLekic    schedule 22.05.2014