[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);