再度VC++を使ってパズル(ペントミノ)を解くプログラムを作ってみる
2023/05/10
パソコンが新しくなり、OSのバージョンもWindows11と、一気に上がって環境も激変したのだった。
そこで、ウィンドウズのプログラミング環境も最新のものにして、色々と遊んでみようと思っているのである。
まず、開発環境である「visual studio 2022」の無料版をダウンロードして、一番慣れているC++を入れた。
まずは画面に字を描いたり、線を描いたり、以前作ったプログラムをコピーして動かしてみたりと、それなりに新しい環境ではエラーが出たり、若干見かけが変わったりするのである。
そして、パズル(ペントミノ)を解くプログラムがそっくり残っていたので、コピーして動作確認をする。
このプログラムは、内部で単純に計算をしていて、画面に線で出力するのと、結果をファイルに書き出すだけなので、基本的にエラーは出ないはずなのだが、やはり問題が発生した。
どうやら、新しいC++の開発環境では、文字データを内部でUTF-8のような2バイトコードで持っているらしいのである。
私が以前作ったプログラムでは、S-JISを想定しており、アルファベットや数字は1バイト、漢字や平仮名は2バイトを想定して作っており、出力はバイナリデータとして作っていたのだった。
ところが、新しい環境では内部が2バイトコードなので、バイナリで出力するとおかしくなるのである。
ということで、CArchiveクラスからGetFile()でCFileクラスを取り出してWrite関数で書き出すのを止め、CArchiveクラスからそのままWriteStringで書き出すことにした。
if (ar.IsStoring())
{
// TODO: 格納するコードをここに追加してください。
// outfile = ar.GetFile();
ar.Flush();
//ar.WriteString(_T("aaaaa"));
//ar.WriteString(_T("あいうえお"));
//ar.WriteString(_T("bbbbb"));
//ar.Flush();
//return;
for (print_ix0 = 0; print_ix0 < print_ans_count; print_ix0++) {
//out_str0 = "\r\n";
//outfile->Write(out_str0, 2);
out_str0.Format(_T("count = %d\r\n"), print_ix0 + 1);
//length = out_str0.Find(_T("\r\n"));
//outfile->Write(out_str0, length + 2);
ar.WriteString(out_str0);
for (print_ix1 = 0; print_ix1 < 12; print_ix1++) {
print_addr = print_ans1[print_ix0][print_ix1];
print_peace = print_ans2[print_ix0][print_ix1];
print_round = print_ans3[print_ix0][print_ix1];
print_ban[print_addr] = print_peace + 1;
print_ban[print_addr + doc_parts[print_peace][print_round][0]] = print_peace + 1;
print_ban[print_addr + doc_parts[print_peace][print_round][1]] = print_peace + 1;
print_ban[print_addr + doc_parts[print_peace][print_round][2]] = print_peace + 1;
print_ban[print_addr + doc_parts[print_peace][print_round][3]] = print_peace + 1;
}
//out_str0 = "\r\n";
//outfile->Write(out_str0, 2);
out_str0 = "+---+---+---+---+---+---+---+---+---+---+\r\n";
//length = out_str0.Find(_T("\r\n"));
//outfile->Write(out_str0, length + 2);
ar.WriteString(out_str0);
for (print_ix1 = 0; print_ix1 < 6; print_ix1++) {
out_str0 = "";
out_str1 = "";
for (print_ix2 = 0; print_ix2 < 10; print_ix2++) {
print_ix3 = print_ix1 + print_ix2 * 7;
if (print_ix2 == 0) {
out_str0 = "|";
out_str1 = "+";
}
if (print_ban[print_ix3] == print_ban[print_ix3 + 7]) {
out_str0 = out_str0 + _T(" ");
if (print_ban[print_ix3] == print_ban[print_ix3 + 1]) {
if (print_ban[print_ix3] == print_ban[print_ix3 + 8]) out_str1 = out_str1 + _T(" ");
else out_str1 = out_str1 + _T(" +");
}
else out_str1 = out_str1 + _T("---+");
}
else {
out_str0 = out_str0 + _T(" |");
if (print_ban[print_ix3] == print_ban[print_ix3 + 1]) out_str1 = out_str1 + _T(" +");
else out_str1 = out_str1 + _T("---+");
}
}
out_str0 = out_str0 + _T("\r\n");
//length = out_str0.Find(_T("\r\n"));
//outfile->Write(out_str0, length + 2);
ar.WriteString(out_str0);
out_str1 = out_str1 + _T("\r\n");
//length = out_str1.Find(_T("\r\n"));
//outfile->Write(out_str1, length + 2);
ar.WriteString(out_str1);
}
out_str1 = _T("\r\n");
ar.WriteString(out_str1);
ar.Flush();
}
}
else
{
// TODO: 読み込むコードをここに追加してください。
}
テキストファイルへの回答の書き出し。
新しいパソコンは、CPUがi5で、2.50GHz動作、メモリは8Gバイトである。
以前のパソコンは、CPUがi3で、クロックが3.5GHz動作、メモリは4Gバイトだったのである。
見ると、クロックが若干遅い。
さて、速度的にはどうなんだろうか?
1.859秒となり、以前の1.954秒よりは早いのである。
しかし、その差はせいぜい5%程度であり、「誤差の範囲内」と言ってもよいほどである。
圧倒的な速さとは言えず、やはりクロックがあまり早くないせいかもしれない。
HOME