再度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: 読み込むコードをここに追加してください。
	}



photo1724
テキストファイルへの回答の書き出し。



新しいパソコンは、CPUがi5で、2.50GHz動作、メモリは8Gバイトである。
以前のパソコンは、CPUがi3で、クロックが3.5GHz動作、メモリは4Gバイトだったのである。

見ると、クロックが若干遅い。
さて、速度的にはどうなんだろうか?

photo1725
1.859秒となり、以前の1.954秒よりは早いのである。
しかし、その差はせいぜい5%程度であり、「誤差の範囲内」と言ってもよいほどである。

圧倒的な速さとは言えず、やはりクロックがあまり早くないせいかもしれない。




HOME