在 FLTK 中添加和分配值
Adding and assigning values in FLTK
在过去的几天里,我一直在断断续续地学习FLTK,但今天我遇到了困难。
这是该程序应该如何工作的。有两个按钮:but1
,but2.
每个按钮旁边都有一个输入小部件。底部还有一个输出小部件。 按下按钮会将相应的输入发送到输出字段,并将其添加到当前显示的值中。
我无法弄清楚如何添加两个小部件的值,因为显然它们存储为字符串。我想出了一个想法来规避这个问题,首先将输入值转换为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_string
C++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());
}
}
相关文章:
- 如何添加循环期间分配的变量?
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 分配一个(固定大小)矢量<矢量<double>>以便高效访问并添加它们?
- 将动态分配的对象添加到对象指针数组中
- 将节点添加到链接列表中,而无需明确分配内存空间(无需使用新)
- 在 FLTK 中添加和分配值
- 将句法分配到过载 =以初始化向量并添加值
- 如何在 std::map 中添加元素自己进行分配
- 如何使用动态内存分配在现有数组中创建和添加新对象
- 为什么 ::运算符关键字添加到 new 之前用于内存分配
- 如何仅使用添加和分配执行乘法
- 内存管理 - 添加小部件是否分配父级
- 如何将连续的内存块(动态地)添加到先前分配的动态内存中
- 如何添加到已分配的字符
- 将对象添加到预先分配的对象数组中
- 将元素添加到基于范围的预分配向量中是否合法
- 使用动态内存分配将元素添加到数组中
- C++ 气泡数组分配 - 添加标记以显示更改
- 在分配的数组之外添加项
- 将指针分配添加到矢量后删除指针分配