过去几天我一直在学习FLTK,但今天我来到了难以接受的地步。
这是程序应该如何工作的。有两个按钮:but1
,but2.
每个按钮旁边都有一个输入小部件。底部还有一个输出小部件。
按下按钮会将相应的输入发送到输出字段,并将其添加到当前显示的值。
我无法弄清楚如何添加两个小部件的值,因为显然它们存储为字符串。我想出了一个想法,通过首先将输入值转换为int,然后将其添加到名为“sum
”的变量(其值最初为0),将其转换回字符串({{1} })然后才将其分配给输出作为其值。但是,它显然会使功能超载。我不知道我做错了什么,因为把ssum
放在那里工作正常。
我该怎么做?有没有更好的方法将存储在别处的值分配给窗口小部件?或者可能有一种直接的方法来添加小部件的值?
以下是整个代码:
inp->value()
答案 0 :(得分:0)
你必须将字符串从输入转换为整数才能添加它们,然后你需要将结果转换回字符串以显示它。但是,您的代码在应该将sum
转换为字符串的部分失败。
C样式字符串是以0分隔的字符数组。在C ++中,您通常应该使用更安全的类std::string
。在您的代码中ssum
不任何类型的字符串。它是char
- 它是单个字符,例如'a'
,'X'
等等,它由8位整数值表示。要将int
转换为string
,您可以在C ++ 11中使用std::to_string
函数,在旧版本中使用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());
}
}