デバッグの仕方 
   -print文によるデバッグ

記述が、意図した通りに動くかは、解をチェックしないと正確には分かりません。しかし、for ループや、if 文が意図した通りに動いているかは、解を出す前にチェックが可能です。 

解をチェックする前に意図通りにループが展開されているかチェックすることをお勧めします。


1. 文法エラーの除去 (よくある記述ミス)


次の記述で、エラーはどこにあるでしょうか?

vector vA;
for (person in 全スタッフ){
		vA.push_back(X[person][スケジュール開始日][B]);
}


外部ファイル(2)で構文エラーがあります。
は、文法エラーがあったことを示しています。(2)は、2行目に問題があることを示しています。
Note:前後+−1行を見てください。

実は、上の文は、何も問題ありません。文字コードをShiftJiISで保存したために起きています。UTF-8を前提にパーサ(構文解析器)は読み込みます。UTF-8は、ASCII文字に関しては、互換性があり、仮に全部がアルファベットによる記述ならば問題ありません。しかし、日本語が含まれていると文字コードが違うためにそこで文法エラーとなります。記述は、必ずUTF8で保存してください。


それでは、次のコードはどうでしょう。このコードは、上と厳密に異なっています。エラー箇所は、上の指摘に同じです。勿論、今度は、UTF8で保存してあります。

vector vA;
for (person in 全スタッフ){
		vA.push_back(X[person][スケジュール開始日][B]);
}


上のコードだと、分かりづらいのですが、下だと少し分かり易くなっています。全スタッフの前に全角空白が入っています。全角の空白は、構文エラーになります。
区切り文字は、半角の空白のみです。日本語で記述していると、ついつい全角空白を入れてしまうのですが、入れないように気をつけてください。


大体、数行書けば、文法エラーにはぶち当たると思います。これについては、一つ一つ潰していく以外ありません。その中で、間違いやすいのが、”全スタッフ” 等の日本語の定義です。とくに、アルファベット数字が入り混じっている場合、半角と全角の区別は目視では難しいところもあるので、コピペすることをお勧めします。PC版では、ソルバを置いているフォルダに、ソルバへの入力となる記述があります。problem_server.svというテキストファイルを開いてみてください。この中にGUIがソルバへ渡す全情報が含まれています。当然、GUIで定義された情報もUTF8で入っています。ここからコピペして使うと、余分な事で悩まなくて済みます。

2. for ループの動作確認


次のようにprint文でfor ループが動作しているときの状態を見ることが出来ます。

vector vA;
for (person in 全スタッフ){
	vA.push_back(X[person][スケジュール開始日][B]);
	print(person,vA);
}

全スタッフは、内部的には数字のリストになっており、菅原は0、渡辺は1という具合に、for ループが回るごとにpersonに代入されていきます。
また、vector vAには、お尻からそのときのpersonの値で追加されています。print文は、様子を見るだけで、制約には何の影響もありません。

このようにして、制約を実行するときの様子を知ることができます。確認できたら、実際に、制約ステートメントを追加していけばよいでしょう。

上の例は、制約するステートメントがありませんでしたので、次のように追加してみました。

for (person in 全スタッフ){
        vector vA;
        for (day in 第2週){
                vA.push_back(X[person][day][B]);
                print(person,day,vA);
        }
        $And(vA);
}

第2週は、2日間しかないので、下のように、vectorには最大2個しか追加されていません。

この実行結果は次のようになります。2週目でしっかり全員がシフトB(ラベル2)になっています。意図した通りですね。


[Prev] [Next] [Index] [Home]