2018年02月02日

「初心者におススメ!」

ふと、聞いていたラジオ番組で「初心者におススメ!」というテーマでのメッセージ募集があったので思い出したこと。

C言語/C++言語で作成したソフトを公開していることもあって、「C/C++を学ぶにはどんな本を読んだら良いか?どんな本を読んでいたか教えて欲しい、それを見たいので」と聞かれることがあります。

が、僕がC/C++言語を学習していたのはMS-DOS ver.3の時代の話なので、コンパイラの動かし方とか、ファンクションコールがどうとか、現在の常識からはあまりにもかけ離れてしまっていて、全く参考にならないんじゃないかなぁと思います。

まぁ、今なら、初期学習ならネット上の資料だけで十分学習できそうですし。
そもそも、C/C++から始めるような時代でもないでしょうし。


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング

2018年01月30日

シンボルってなに?by中学1年生

中学の頃、C言語でプログラミングをしていて困ったのが、専門用語の類。
中学生が用いる英和辞書では、分からないことだらけ。

コンパイルエラーのメッセージを見ていて困ったのが、「シンボル」(symbol)という用語でした。
一体何を示しているのか?
分からないので、結局、エラーメッセージなんて当てにせず、該当行の周辺をずーっと眺めて、間違いを見付けていました。
まぁ、それが楽しかったんで、C言語やっていたんですが。

結局のところ「シンボル」って、変数名とか、関数名とか、名前を付けられ識別される「モノ」を一般的に指して呼ぶときの言い方なんですよね。「識別子」とでも訳すべきでしょうか。種別を識別する前の段階……コンパイルするときの文字の並びを1つの単位で見たときのまとまり。まぁ、中学1年生に「識別子」と言って通じたかどうかは分かりませんが…。

シンボルがどうとかでエラーが発生しているときは、エラーの発生行そのものよりは、その変数を宣言している行とか、関数を定義している行とかだったりを見なければ、本当の間違いは見つからないわけで。そりゃ、真の原因を見付けるのも苦労しました。
当時は、呼び出し先や定義行にジャンプするエディタなんか使っていなかったから、そういうのを探すのも苦労したっけなぁ。


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング

2018年01月25日

コマンドプロンプトからGUIのプログラムを実行し待機したいときに

昨日ちょこっとだけ書いた、ステータスバー監視のプログラムを書こうと思ったら、監視しようとしていたのはステータスバーではなくで独自描画されたグラフィック領域で残念…の話の続き。

結局、監視するのではなく、そのソフトは処理終了後にプロセスを自動終了させるオプションを持っているので、プロセスの動作状態を監視しておけば良い、ということになりました。

つまり、子プロセスとしてそのソフトを起動(CreateProcess)し、WaitForSingleObject() API等で待機すれば良いということですね。

さて、ソフトの位置やオプションは引数で与えるとして、どうやってCreateProcess() に渡そうか。
コマンドプロンプトのプログラムなので、引数はarvc/argv で受け取ることになります。
これをCreateProcess() APIに渡すための引数にするのは、ちょっと面倒。
小間切れに分かれた文字列(argv[])を1つの文字列に再構成し、さらに、スペースが含まれる場合はダブルコーテーションで囲まなければなりません。メッチャ面倒。

GetCommandLine() APIを使おうかとも思いましたが、これは自身のプログラムファイル名も含んでしまうので、除去が面倒。

となると、C言語らしく、_spawnvp()関数に_P_WAIT付けて実行してしまえばよいんじゃないかと。

waitfor_program.png

すると、どうやらうまくいきました!

waitfor_program2.png

試しに、引数にNotepad.exeを与えてみると、メモ帳が起動し、親プログラムは待機。メモ帳を終了させると、親プログラムは終了。WaitForSingleObject() APIも書かずに、上手くいきました! やってみるもんだな。

…と、これをTwitter上で書いたところ、「start /wait」コマンドを使えば良いのではないかとツッコミが…!

し、知らなかった…。
そんな便利なオプションがstartコマンドに存在していたとは…。

無知は罪ですね。

posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング