在 FLTK 中添加和分配值

Adding and assigning values in FLTK

过去几天我一直断断续续地学习 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++ 中,您通常应该使用更安全的 class 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());
    }
}