プログラムを作っても、なかなかうまく動かないと思います。 でも一口に上手く動かないといっても、動かないパターンはいろいろあります。
コンパイルしたら (「ローカル Windows デバッガー」を押したら) 以下のようなダイアログが出てビルド (要はコンパイル) ができないというエラーです。
これはソースプログラムが何か間違っているのです。 日本語の例で言うと
といった感じと言えば伝わるでしょうか。
これはコンパイルは通るのですが、たとえば次のような表示が出て中断するエラーです。
これもソースプログラムが間違っているのです。 これも日本語の例で言うと、
といった感じでしょうか。 何をやって欲しいのかは分かるのですが、実現できないので降参されたのです す。
これもコンパイルは通ります。 しかしプログラムがまったく反応しなくなります。 動きが止まるのです。 これを修復するには、シミュレータ右上の×印を押すか、
Visual Studio で赤い四角のボタンを押す必要があります。
この類のエラーもプログラムが間違っていることが原因です。 日本語で説明すると
といった感じでしょうか。 コンピュータは愚直に命令を遂行し続けているのですが、 条件が満たされる機会が無いため延々と実行しているのです。
これもコンパイルは通ります。実行してもなんか動きます。 しかし思ったように動いてくれなかったという不具合です。 コンピュータはまず間違いません。 そのためこれは書いたプログラムに何かミスがあったのです。 日本語の例として目玉焼きを作る手順で説明しましょう。 例えば次のような手順はどうでしょうか。
実はこれ上手くいきません。 フライパンを火にかけることを忘れているからです。 1 分 15 秒経っても卵は生卵のままです。 日本語は正しくてもそれを読み解くとおかしい所があったのです。 この類のエラーは大きく二つに分類されます。
いずれにせよ、思い描いた手順だと、こういう状態の時はこういう風に動くという理想像と実際のプログラムの動きとを見比べて、 どこがおかしいのか推理して解決するしかありません。
ここでは 1 のコンパイルエラーが発生した時の対策を話してみます。 一言にコンパイルエラーと言っても理由は様々です。 画面に出てくる
という威圧的なダイアログに圧倒されるかもしれませんが、 実は Visual Studio の下の方にどこでどんなエラーが出たか書かれています。
ここでエラーですが、相手は所詮コンピュータです。 一つの記述ミスに対して、ドミノ倒し的に「これもおかしい」「ここも分からん」とエラーをダラダラ示してきます。 その量に圧倒されず、とにかく最初に出た一つ目のエラーだけ着目し その解決を試みてください。 ドミノ倒しみたいなものですから、最初の一つを解決すると全部が解決することもあります。
下の方に出ているエラーの一番上 (図の例では「E0077 この宣言にはストレージクラスまたは...」と書いている行) をダブルクリックすると、大抵は該当行が表示されます。
この例ではソースの中に余計な aaa というゴミが入っていました。 この原因を取り除くとコンパイルエラーはすべてなくなります。 これから初心者がよくやるミスとその時にどんなエラーが出るかをいくつか紹介しますが、エラーの種類は非常に多いのでとても全部網羅できません。 E0077 等とエラーにはコード番号が出ているので、このコードで検索すると解決策が見つかるかもしれません。
該当行をよく見てください。先述したように何かゴミが入っているはずです。
該当行をよく見てください。先述したように何かゴミが入っているはずです。
該当行で使っている変数が宣言されてないのかもしれませんし、 単なるスペルミスかもしれません。 また数値を日本語モードで書いてしまってもこうなります。
言われた通りです。C 言語では命令はセミコロン (;) で区切ります。
同じ変数や関数を複数回定義しています。
左括弧の数と右括弧の数が合ってなかったことが原因です。 左右の括弧は必ず対で使う必要があります。
例えば for 文や if 文は、繰り返したり条件が成立したりした時に実行する命令が必要です。 コメントアウトか何かでそれを消してしまうとこういったエラーになります。
例えば関数 NaviCmd() は、引数が二個必要ですが二個無い場合はこういったエラーになります。逆に多い場合は E0140 エラーになります
ソースコード中に日本語が入っています。 日本語の空白文字を入れてませんか。
次は、コンパイルは上手くいったけど動きがおかしい時の話です。 これは、実際に動かしてみて、想定と異なる点を確認し、その原因を推理するのが簡単です (パズルを解くように、頭の中でコンピュータの動きをシミュレートするのも面白いのですが)。
まず、最も基本的なプリントデバッグという方法を紹介しましょう。 プログラム実行中に数字や文字を出力し、内部の状態を確認する方法です。 C 言語で文字を表示するには printf() という関数を使います。 printf() は C 言語の基本なので学校のプログラミングの授業で習った方も多いかもしれません。簡単に説明すると
printf("hello\n"); |
と書くと、画面に hello という文字が表れます。 \n は改行という意味です。 また
printf("%d\n", n); |
と書くと、その時点で int 型の変数 n に格納された値が出力されます。 %d は「この部分を 10 進法の整数の文字に置換してくれ」という意味です。
printf("x=%d, y=%d\n", n, m); |
と書けば、n が 44, m が 13 だったら
x=44, y=13 |
と出力されます。
さらっと「表示される」と書きましたが、それはどこにでしょうか。 学校の授業なら、gcc などのコマンドを実行したコンソール画面に表示されていました。 しかし本環境は GUI なのでそれがありません。 実は GUI プログラムの開発では、次で紹介する IDE を使って動作確認するのが主流なのですが、 本環境でもできるようにしています。 画面右下に「コンソール画面を表示する」というチェックボックスがあります。 これをチェックすると printf() 等で出力する先が表示されます。
IDE とはプログラム開発に関する様々な機能を一つにまとめたソフトウェアです。 本コンテストで使うVisual Studioも IDE の一種です。 IDE の主要な機能の一つとして、プログラムの動作を目視で確認する機能があります。 プリントデバッグでは、コードのあちこちに printf() を入れた後いちいちコンパイル(ビルド) する必要がありましたが、IDE ではそういう手間は要りません。 ただコンパイルオプションを適切に設定しておく必要があります。 具体的は Debug か Z_Debug プロジェクトを選んでください。 Release はダメです。
IDE が持つプログラム開発支援の機能は沢山ありすぎるのですが、 ここではブレイクポイントとステップオーバ、そしてクイックウォッチだけに絞って紹介しましょう。
プログラムが『そこ』を通過したら一時停止をする場所を指定する機能です。 コードの左が少し帯があり、その部分をクリックすると赤い丸が付きます。 これがブレイクポイントです。
例えば上の例では Loop() 関数の一番最初の命令にブレイクポイントを作ってます。 この状態でプログラムを動かしても ( 「ローカル Windows デバッガー」を押しても)、すぐには止まりません。 この箇所にプログラムが来てないからです。 Loop() 関数はロボットが各ターンの動きを決める時に呼び出されます。 すなわち、地図を選択し、Reset を押し、START もしくは STEP を押した瞬間に ここにきて、一時停止します。
中断すると、赤い丸の上に右矢印が重なります。 ここで今止まっているという意味です。 この状態で「続行」ボタンを押すと、プログラムは再び動き出し、 次にブレイクポイントを通過した時にまた止まります。 ブレイクポイントを解除するには赤い丸をクリックします。
ブレイクポイントはプログラム実行中にも設定できます。 例えば、なぜこの障害物を避けるとき変な動きをしているのか知りたいのであれば、 次のターンでおかしくなる直前で (本コンテストは乱数要素が無いので最初から やりなおせば同じ動きをします) PAUSE を押し、ブレイクポイントを設定してから STEP ボタンを押せば、Loop() 関数の動きを詳しく観察できます。
またブレイクポイントは何個でも設置可能です。 複数個設置してここかここかここに来たら止めるという運用も可能です。
ブレイクポイントで一時停止すると、そこで止まっていると右矢印が重なります。 その時点でステップオーバボタンを押すと、一行だけ命令が進みます。
ここではシンプルに「一行だけ」と述べましたが、 正確には少し違います。 例えば if 文は
if (条件) 条件が成立した時に実行する命令; |
と書くのが一般的です。 この時、if 文にさしかかった時点で「ステップオーバ」を行うと、 条件が成立しない場合は次の行を飛ばしてもっと後ろの処理へ進みます (矢印がそこに移動します)。 このように、どの if 文を通過したのか、for 文で何回繰り返したのかとか数えることができます。 プログラムの動作が意図した通りになっているかを コマ送りのように確認できるのが「ステップオーバ」の利点です。
なお、ここでは「ステップオーバ」のみ説明しましたが、 類似の機能として「ステップイン」や「ステップアウト」もあります。 ステップオーバに慣れてきたら、これらの機能も試してみてください。
ブレイクポイントやステップオーバでプログラムを止めると その時点で変数の値も確認することができます。 もっとも簡単な方法は、ソースコード上で変数の近くにマウスカーソルを持っていく方法です。 その変数に格納されている値がポップアップで表示されます。
この機能だけでも十分なことが多いですが、 配列や構造体などの複雑なデータを詳しく見たい場合は、 変数を右クリックして「クイックウォッチ」を選択すると、 より詳細な情報が確認できます。