[C++]107 FLTK : 表示色の履歴管理および順逆送り new演算子

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

手掛けてみたら予想通りのややこしさでしたが、運良くすんなり書けました。

C/C++ユーザーの方々には釈迦に説法ですが、変数やポインタのvectorを無処理で作成し履歴データとして蓄積しても勝手に上書きされるので失敗します。

new演算子でメモリを確保し、そこにデータを入れてからvectorを作成します。

確保したメモリをdelete演算子でどのようにどのタイミングで解放するのか、についてはこれから考えます。

vector<vector<const char*>> selectColorList;
const char *name_c, *roma_c, *code_c;
int color_index;

void selectColorListMake(const char* name, const char* roma, const char* code){
    color_index = selectColorList.size();

    vector<const char*> selectColor = {name, roma, code};
    selectColorList.push_back(selectColor);
    color_index += 1;
}

void prevColor(Fl_Widget*, void*){
    if (!(color_index < 2)){
        vector<const char*> prev_color = selectColorList[color_index -1 -1];
        name_c = prev_color[0];
        roma_c = prev_color[1];
        code_c = prev_color[2];
        cout << "name:" << name_c;
        cout << " roma:" << roma_c;
        cout << " code:" << code_c;
        color_index -= 1;
        cout << " index:" << (to_string(color_index)).c_str() << endl;;

        name_input->value("");
        name_input->insert(name_c);
        roma_input->value("");
        roma_input->insert(roma_c);
        code_input->value("");
        code_input->insert(code_c);

        output_line->insert(name_c);
        output_line->insert(" ");

        showColor();
    } else {
        cout << "記録はありません" << endl;
    }
}

void nextColor(Fl_Widget*, void*){
    if (!(color_index >= selectColorList.size())){
        vector<const char*> next_color = selectColorList[color_index -1 + 1];
        name_c = next_color[0];
        roma_c = next_color[1];
        code_c = next_color[2];
        cout << "name:" << name_c;
        cout << " roma:" << roma_c;
        cout << " code:" << code_c;
        color_index += 1;
        cout << " index:" << (to_string(color_index)).c_str() << endl;

        name_input->value("");
        name_input->insert(name_c);
        roma_input->value("");
        roma_input->insert(roma_c);
        code_input->value("");
        code_input->insert(code_c);

        output_line->insert(name_c);
        output_line->insert(" ");

        showColor();
    } else {
        cout << "記録はありません" << endl;
    }
}

色表示する関数内
// selectColor追加
const char* name_c2 = name_input->value();
char* name_c3 = new char[strlen(name_c2) + 1];
strcpy(name_c3, name_c2);

const char* roma_c2 = roma_input->value();
char* roma_c3 = new char[strlen(roma_c2) + 1];
strcpy(roma_c3, roma_c2);

const char* code_c2 = code_input->value();
char* code_c3 = new char[strlen(code_c2) + 1];
strcpy(code_c3, code_c2);

selectColorListMake(name_c3, roma_c3, code_c3);