在 FLTK 中添加和分配值

Adding and assigning values in FLTK

本文关键字:分配 添加 FLTK      更新时间:2023-10-16

在过去的几天里,我一直在断断续续地学习FLTK,但今天我遇到了困难。

这是该程序应该如何工作的。有两个按钮:but1but2.每个按钮旁边都有一个输入小部件。底部还有一个输出小部件。 按下按钮会将相应的输入发送到输出字段,并将其添加到当前显示的值中。

我无法弄清楚如何添加两个小部件的值,因为显然它们存储为字符串。我想出了一个想法来规避这个问题,首先将输入值转换为int,然后将其添加到一个名为"sum"的变量(其值最初为0),将其转换回字符串(ssum),然后才将其分配给输出作为其值。但是,它显然使函数过载。我不知道我做错了什么,因为把inp->value()放在那里效果很好。

我该怎么做?有没有更好的方法将存储在其他地方的值分配给小部件?或者也许有一种简单的方法来添加小部件的值?

这是整个代码:

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Widget.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Output.H>
#include <string>
using namespace std;
Fl_Output* out;
int sum=0;
char ssum;
void cb_send(Fl_Widget* w, void *v)
{
if (((Fl_Button*)w)->value() == 0)
{
w->hide();
Fl_Input* inp = (Fl_Input*)v;
sum = sum + atoi(inp->value());
ssum = sum;
out->value(ssum);
//out->value(inp->value()); this works 
//out->value( out->value() + inp->value() ); this should theoretically work?
}
}
int main(int argc, char **argv)
{
Fl_Window *winmain = new Fl_Window(500, 500);
Fl_Button *but1 = new Fl_Button(100, 100, 50, 50, "1");
Fl_Button *but2 = new Fl_Button(100, 200, 50, 50, "2");
Fl_Input *no1 = new Fl_Input(170, 100, 150, 50, "");
Fl_Input *no2 = new Fl_Input(170, 200, 150, 50, "");
out = new Fl_Output(170, 300, 150, 50, "");
but1->callback((Fl_Callback*) cb_send, no1);
but2->callback((Fl_Callback*) cb_send, no2);
winmain->resizable();
winmain->end();
winmain->show(argc, argv);
return Fl::run();
}

您是对的,您必须将字符串从输入转换为整数才能添加它们,然后您需要将结果转换回字符串以显示它。但是,您的代码在应该将sum转换为字符串的部分失败。

C 样式字符串是一个以 0 分隔的字符数组。在C++中,您通常应该使用更安全的类std::string。在您的代码中,ssum不是任何类型的字符串。它是一个char- 它是一个字符,例如'a''X'等,它由一个 8 位整数值表示。要将int转换为string您可以使用std::to_stringC++11 中的函数或在旧版本中使用std::stringstream函数。

C++11

解决方案
void cb_send(Fl_Widget* w, void *v)
{
if (((Fl_Button*)w)->value() == 0)
{
w->hide();
Fl_Input* inp = (Fl_Input*)v;
sum = sum + atoi(inp->value());
out->value(std::to_string(sum).c_str());
}
}

C++11 前解决方案

#include <sstream>
...
void cb_send(Fl_Widget* w, void *v)
{
if (((Fl_Button*)w)->value() == 0)
{
w->hide();
Fl_Input* inp = (Fl_Input*)v;
sum = sum + atoi(inp->value());
std::stringstream ss;
ss << sum;
out->value(ss.str().c_str());
}
}