FrameNext関数の働き・役割
FrameNext関数は、データフレームを読み込んだ後、ポインタを次のフレームに移動するための関数です。この関数には2つの書式があり、シンプルに1つの数値を取得する場合と、フレームの全データを配列として取得する場合とで使い分けができます。
最適化の際にフレームごとに異なるデータを読み取り、パフォーマンスや特定の数値に基づいた分析を行う際に使用されます。FrameNext関数を活用することで、各フレームに格納されているパラメータや値を効率的に取得できます。
FrameNext関数の引数について
bool FrameNext(
ulong& pass, // フレームが追加された最適化でのパスの番号
string& name, // 識別子の名称・レベル
long& id, // パブリックID
double& value // 単一の数値
);
書式1
FrameNext関数の1つ目の書式は、指定されたフレームに関連付けられたパス番号や識別子の名称、ID、単一の数値を読み取ります。パス番号や識別子の情報に基づいたデータ取得が可能です。
書式2
bool FrameNext(
ulong& pass, // フレームが追加された最適化でのパスの番号
string& name, // 識別子の名称・レベル
long& id, // パブリックID
double& value, // 単一の数値
void& data[] // 任意型の配列
);
FrameNext関数の2つ目の書式は、フレームの全データを受け取るため、上記のパラメータに加えて任意型の配列も取得します。配列dataには、フレームの詳細なデータが格納されるため、個別の情報を取得する場面で有用です。
FrameNext関数の戻り値について
FrameNext関数は、フレームのデータ取得とポインタの移動が成功した場合にtrueを返します。フレームのデータを読み取る際、次のフレームへのポインタ移動やデータの処理が適切に行われない場合、falseが返されます。falseが返された場合には、GetLastError関数を使用して、エラーの詳細情報を確認することが推奨されます。エラーの原因には、フレームデータの欠損やポインタ操作の失敗などが考えられます。
FrameNext関数を使ったサンプルコード
// 最適化の各パスで新しいフレームが到着した際に自動的に呼び出される関数
void OnTesterPass()
{
// フレームのパスIDを格納するための変数。最適化の各パス(試行)ごとに一意のIDが付与される
ulong pass_id;
// フレームの名前を格納するための変数。FrameAdd関数を使って送信される際に設定された名前が入る
string frame_name;
// フレームの識別IDを格納する変数。FrameAdd関数で設定した識別番号が保持される
long frame_id;
// フレームの値(数値データ)を格納するための変数。FrameAddで指定された数値情報が入る
double frame_value;
// FrameNext関数は、次のフレームが存在する限りtrueを返し、フレームデータを変数に格納する
// フレームがなくなるまでループを継続
while(FrameNext(pass_id, frame_name, frame_id, frame_value))
{
// 取得したフレームデータをエキスパートログに出力
// Print関数を使用し、Pass ID、フレーム名、識別ID、値の情報を表示
Print("Pass ID: ", pass_id, // 最適化のパスIDを表示
" Name: ", frame_name, // フレームの名前を表示
" ID: ", frame_id, // フレームの識別IDを表示
" Value: ", DoubleToString(frame_value, 2)); // 数値データを小数点2桁で表示
}
}
// 最適化が終了した後に未処理のフレームを処理するための関数
void OnTesterDeinit()
{
// 最適化パスID、フレーム名、識別ID、値を保持する変数を定義
ulong pass_id;
string frame_name;
long frame_id;
double frame_value;
// FrameFirst関数を呼び出してフレームの最初の位置に移動
// 最適化完了後、すべてのフレームを再確認する準備を行う
FrameFirst();
// 未処理のフレームがある限り、次のフレームを取得して処理を繰り返す
while(FrameNext(pass_id, frame_name, frame_id, frame_value))
{
// 未処理のフレームデータをエキスパートログに出力して確認
Print("Deinit - Pass ID: ", pass_id, // 最適化パスIDを表示
" Name: ", frame_name, // フレームの名前を表示
" ID: ", frame_id, // フレームの識別IDを表示
" Value: ", DoubleToString(frame_value, 2)); // 数値データを小数点2桁で表示
}
}
サンプルコードに使われた関数や変数の詳細な解説
- OnTesterPass関数
最適化中にテストエージェントから新しいデータフレームが送信された際に自動的に呼び出され、フレーム内容の受け取りと処理を行う関数です。 - OnTesterDeinit関数
最適化が完了した後に呼び出され、未処理のフレームを確認・処理するために使用されます。 - pass_id
各最適化パス(試行)ごとに一意のIDを格納するための変数で、FrameNext関数で取得されます。 - frame_name
フレームの名前を格納する変数で、FrameAdd関数で設定した名前が入ります。識別名として利用することができます。 - frame_id
フレームの識別IDを保持する変数で、各フレームの特定情報として設定されます。 - frame_value
フレームに含まれる数値データを格納する変数です。最適化の結果や評価指標などを受け取ります。 - while文
while文は、条件が満たされている限り繰り返し処理を実行する構文です。このコードでは、FrameNext関数がtrueを返す間、つまり未処理のフレームがある限りループが続きます。while文の内部でFrameNext関数が新たなフレームデータを取得し、変数に格納して処理を繰り返します。 - FrameNext関数
次のフレームが存在するかを確認し、存在する場合にはそのデータを取得して指定の変数に格納します。未処理のフレームを順次処理する際に使用します。 - FrameFirst関数
最初のフレームに移動するために使用します。OnTesterDeinit関数で、フレームの再処理を行う際に利用されます。 - Print関数
取得したデータをエキスパートログに表示するための関数です。このサンプルでは各フレームのID、名前、識別ID、数値データを表示しています。 - DoubleToString関数
DoubleToString関数は、数値を文字列に変換する関数です。このコードではframe_valueを小数点以下2桁に指定して文字列化し、エキスパートログに出力しています。