2017-04-04 59 views
0

我已經和關閉學習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(); 
} 
+0

好的,我知道了。沒有必要添加字符串。我可以使用Fl_Value_Input來代替,並且一切正常。 –

回答

0

你是對的,你必須字符串從輸入轉換爲整數,以增加它們,那麼你需要將結果轉換回字符串來顯示它。但是,你的代碼在應該將sum轉換爲字符串的部分上失敗。

空調風格串是字符的0-分隔的陣列。在C++中,您通常應該使用更安全的類std::string。在您的代碼ssum中是而不是任何類型的字符串。它是一個char - 它是一個單個字符,例如'a','X'等等,它由一個8位整數值表示。對於轉換intstring您可以在舊版本使用C++ 11或std::stringstreamstd::to_string功能。

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()); 
    } 
}