#c #callback #fltk
#c #обратный вызов #fltk
Вопрос:
void MainMenu::cb_userinput(fltk::Input *in, void *v)
{
MainMenu *mm = (MainMenu*)v;
memset(user_input, '', sizeof(user_input));
strcpy((char*)user_input, in->value());
in->value('');
memset(user_input, '', sizeof(user_input));
mm->ExitFromMenu();
}
void MainMenu::ExitFromMenu()
{
Menu->clear();
Menu->end();
}
строка, которую я вызываю обратный вызов
input->callback((fltk::Callback*)cb_userinput, this);
функция обратного вызова вызывается успешно, если я удаляю обе строки из функции ниже, то моя программа выполняется успешно, но если я использую обе эти строки, то программа выдает ошибку ошибки сегментации,
void MainMenu::ExitFromMenu()
{
//Menu->clear();
//Menu->end();
}
Я не могу использовать gdb, поскольку эта программа запущена на удаленном устройстве, кто-нибудь может помочь мне выяснить проблему? заранее спасибо.
Полный класс
class MainMenu : public IUserOptions
{
protected:
Group *Menu;
void DisplayUserOptions();
static char user_input[3];
static void cb_userinput(fltk::Input *in, void *v);
int user_choice;
void ExitFromMenu();
public:
MainMenu(vector<string> userChoices);
int GetUserOption();
~MainMenu();
};
char MainMenu::user_input[3];
MainMenu::MainMenu(vector<string> userChoices) : IUserOptions(userChoices)
{
Menu = new fltk::Group(0, 0, 320, 220, "");
}
void MainMenu::cb_userinput(fltk::Input *in, void *v)
{
MainMenu *mm = (MainMenu*)v;
memset(user_input, '', sizeof(user_input));
strcpy((char*)user_input, in->value());
in->value('');
memset(user_input, '', sizeof(user_input));
mm->ExitFromMenu();
}
void MainMenu::ExitFromMenu()
{
Menu->clear();
Menu->end();
}
void MainMenu::DisplayUserOptions()
{
Menu->set_vertical();
Menu->begin();
fltk::Widget *Wel = new fltk::Widget(0, 0,320, 220, "");
Wel->color((fltk::Color)0xf5751000);
Wel->box(fltk::FLAT_BOX);
fltk::Widget *MAIN_MENU_BOX = new Widget(0, 0, 320, 30, "Genus Power Vers 1.0.0");
MAIN_MENU_BOX->box(FLAT_BOX);
MAIN_MENU_BOX->color((fltk::Color)0x6E040600);
MAIN_MENU_BOX->labelfont(fltk::TIMES_BOLD);
MAIN_MENU_BOX->labelsize(20);
MAIN_MENU_BOX->labelcolor(WHITE);
// first Menu Option Download Meter
fltk::Button *mb1= new fltk::Button(10,40,200,30, " 1. Download ");//60
mb1->labelfont(fltk::TIMES_BOLD);
mb1->labelsize(16);
mb1->argument(1);
mb1->take_focus();
mb1->color((fltk::Color)0x6E040600);
mb1->align(fltk::ALIGN_CENTER);
mb1->labelcolor(WHITE);
mb1->box(ROUNDED_BOX);
fltk::Input* input = new fltk::Input(400, 60, 120, 25, "key :");
input->labelsize(14);
input->callback((fltk::Callback*)cb_userinput, this);
input->take_focus();
input->argument(2);
input->labelfont(HELVETICA_BOLD_ITALIC);
input->textsize(14);
input->textfont(fltk::COURIER_BOLD);
input->when(fltk::WHEN_ENTER_KEY_CHANGED);
// Second Menu Option to Print
fltk::Button *mb2= new fltk::Button(10,80,200,30, " 0. Quit ");//60
mb2->labelfont(fltk::TIMES_BOLD);
mb2->labelsize(16);
mb2->color((fltk::Color)0x6E040600);
mb2->align(fltk::ALIGN_CENTER);
mb2->labelcolor(WHITE);
mb2->box(ROUNDED_BOX);
Menu->end();
}
int MainMenu::GetUserOption()
{
cout << endl << "Address of this:" << this << endl;
getchar();
DisplayUserOptions();
return user_choice;
}
MainMenu::~MainMenu()
{
delete Menu;
}
и мой базовый класс
class IUserOptions
{
protected:
vector<string> UserChoices;
public:
IUserOptions(vector<string> userChoices);
virtual int GetUserOption() = 0;
virtual ~IUserOptions();
};
Комментарии:
1.
memset(user_input, '', sizeof(user_input));
выглядит опасно. У вас есть ссылка на документацию дляfltk::Input
класса?2. спасибо за ваше замечание, я удалю его, но это не создает проблемы
3. Ну, это похоже на потенциальное неопределенное поведение, и в этом случае может случиться все, что угодно. Ссылка на документацию все равно была бы хороша.
4. Ссылка на документацию все равно будет хорошей.?? не понял?
5. Здравствуйте, спасибо за вашу поддержку, я исправил свою ошибку в документации и удалил оператор «ввод-> аргумент (2)», моя проблема исчезла. Еще раз спасибо