「なだれサイズ」と呼ばれるものを記録しようとしている C プログラムがあります。これを記録する基準は、プログラムによって生成された「delta_energy」がゼロ以下の場合、「*avalanche_size = *avalanche_size + 1;」で雪崩のサイズを増やすことができます。delta_energy が 0 以上の場合、雪崩のサイズをインクリメントせずにループを実行し続けます。
したがって、私がやりたいことは、以下のコードに示すように、delta_energys_GSA というファイルに AVALANCHE SIZE IS INCREMENTED (そうでない場合) のデルタ エネルギーを書き込むことです。
しかし、私が見つけたのは、fprintfステートメントをif{}内に配置すると、なだれのサイズが確実に増加すると、1回の反復を行うたびに、ファイル内のすべてのエントリが上書きされることです。したがって、最終的には、反復の 1 つのデルタ エネルギーのみを含むファイルになります。fprintf ステートメネットをブラケットの外に置くと、すべてが記録されますが、雪崩のサイズが増加せず、それらが必要ない場合のデルタ エネルギーも得られます。
「雪崩のサイズが以前の雪崩のサイズよりも大きい場合、デルタエネルギーをfprintfする」のような条件を実行することを考えました...しかし、雪崩のサイズはベクトルではなく単なる整数であるため、これを行う方法がわかりません。 .
どんな助けでも本当に感謝します! ありがとうございました
for (k = 0; k < n_nodes; k++)
{
if (delta_energy <= 0.0)
{
stored_state[i] = new_state;
*avalanche_size = *avalanche_size + 1;
printf("\n\n For k = %d: ",k);
printf("\n\n This is the delta energy with GSA for %d avalanche size:%f", *avalanche_size, delta_energy);
fprintf(delta_energies_GSA,"\n %d\t %d\t %f \n",k, *avalanche_size, delta_energy);
}
非常に大きなプログラムの非常に大きな関数であるため、完全なコードは示していません。また、ファイルの開閉にも細心の注意を払っています。変数を宣言した後、関数の最初でファイルが開かれます。そして、関数が終了する直前にファイルを閉じます。
ファイルを開く方法は次のとおりです。
{
double d_energy, q_A_minus_1, one_over_q_A_minus_1, prob_term;
neighbor_inf *np;
extern int generate_new_state();
FILE *delta_energies_GSA;
delta_energies_GSA = fopen("delta_energies_GSA.dat", "w");
if (delta_energies_GSA == NULL)
{
printf("I couldn't open delta_energies_GSA.dat for writing.\n");
exit(0);
}
変数を宣言した直後で、関数が終了する前に閉じられます。
fclose(delta_energies_GSA);
return(stored_state);
} /* end recover_stored_patterns_GSA() */