パソコンをつくろう!(パソコン自作のすすめ)
組み立てキットを使って自作に挑戦!
[第443回]
●Wine(18)原因はcprintf(”¥n”)
やっと突き止めた不具合の原因はcprintf(”¥n”)がカーソルが表示画面の最下行にあるときに限ってなぜか実行されないということでした。
カーソルがそれ以外の行にあるときは期待した通りに実行されます。
そしてこれはLinuxのWineにおいての現象です。
Windowsではカーソル位置に関係なく有効に実行されます。
もっともGoogle(AI)によるとcprintf()は廃止予定の古い関数なので代わりに_crintf()を使えとのご託宣です。
なるほど。
Windowsでは問題がなくてもLinuxでは駄目というあたりそれなりに説得性がありそうです。
下はZB3.exeのソースプログラム(C++)のキーボードから入力した文字列を処理する部分の一部です。
else if(c==0x0d)///[Enter]
{
venter();
cprintf("\r");cprintf("\n");
vcr();
|
ZB3.exeのキーボード入力はスクリーンエディタになっています。
入力文字列は基本的にはキーボードから入力するのが普通ですがスクリーンエディタでは必ずキーボードから入力しなければならないということではありません。
カーソルを移動してその位置で[Enter]を入力したときにカーソルのある行が入力文字列になります。
それが上のプログラムで
if(c==0x0d){
という部分です。
[Enter]のキーコードは0x0dです。
この時点ではCRもLFも実行されていません。
通常は[Enter]の入力後にCRLFを実行してから何らかの処理をします。
上のプログラムはその部分の動作をはっきりさせるためにCR(”¥r”)とLF(”¥n”)を分けて書いていますが実際のプログラムでは
cprintf(”¥r¥n”);
と書いています。
(実際のプログラムではcprintf(”¥n¥r”);になっています)
とにかくここが問題だったのです。
カーソルが最下行にあるときに限って”¥r”は実行されるけれど”¥n”は無視されてしまうことがわかりました。
で。
下のように対策しました。

左が修正前のZB3V.cppです。
これが現行のZB3.exeの最新版のソースプログラムです。
最初にWineで実行した問題有りのZB3.exeもこれです。
そして右が修正後のZB3VT9.cppです。
オレンジで着色されている行は左右で異なっている行であることを示しています。
このときは試行錯誤の過程でしたので行の順番も変えていますがそこは問題ではありません。
ここで対策した決め手は左側でcprintf(”¥n¥r”);としているところを(ここを”¥r¥n”としても結果は同じです)、
右側ではprintf(”¥r¥n”);にしたことです。
つまりcprintf()の代わりにprintf()を使ったところ前回の通り正しく実行されるようになりました。
それでは。
ZB3DOS.exeは?
それは次回にて。
パソコンをつくろう![第443回]
2026.5.3upload
前へ
目次へ戻る
ホームページトップへ戻る