Linux ボックスで gcc -std=C89 スイッチを使用して C コードをプログラミングしています。この C コードは、 OCILIBライブラリによって呼び出される OCI ドライバを使用して、Oracle データベースと通信します。データベースから必要なデータをダウンロードした後、C プログラムは、多くの複雑な計算を実行する C 関数 (my_function) を呼び出します。プログラムの流れは次のようになります。
int main (void) {
OCI_Connection *cn;
OCI_Statement *st;
OCI_Resultset *rs;
...
/* FIRST CALL TO DB */
OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);
cn = OCI_ConnectionCreate(...);
st = OCI_StatementCreate(cn);
OCI_Prepare(st, ...);
OCI_Bindxxx(st, ...);
OCI_Execute(st);
printf(...); /* verify data retrieved from database is correct */
/* SECOND CALL TO DB */
OCI_Prepare(st, ...); /* different prepare stmt than above */
OCI_Bindxxx(st, ...);
OCI_Execute(st, ...);
printf(...); /* verify data retrieved from database is correct */
/* THIRD CALL TO DB */
OCI_SetFetchSize(st, 200);
OCI_Prepare(st, ...);
OCI_Bindxxx(st, ...);
OCI_Execute(st);
rs = OCI_GetResultset(st);
...
printf(...); /* verify data retrieved from database is correct */
OCI_Cleanup();
return EXIT_SUCCESS;
my_function(...);
}
示されているようにプログラムを実行すると、printf
ステートメントはすべて、正しいデータがデータベースから C プログラムにダウンロードされたことを示します。ただし、my_function
実行していません。
その後return EXIT_SUCCESS
、コード行を beforemy_function()
から AFTERmy_function()
に移動し、コードを再コンパイルして実行すると、printf
ステートメントは、データベースへの最初の呼び出しからのデータが C プログラムに正しく保存されていることを示していますが、2 回目の呼び出しのデータは正しくありません。 、そしてprintf
3 回目の呼び出しからのステートメントは何もしていないように見えます。
コンパイル時および実行時に報告されるエラーや警告はありません。
私はC(またはOCILIB)の経験が豊富ではありませんが、経験がある人にとって、コード内の配置がreturn EXIT_SUCCESS
その前にあるコードと相互作用してこれを引き起こす方法について論理的な説明はありますか?
私の単純な考えでは、コードは一度に 1 行ずつ実行されると考えているため、コードが 123 行目まで機能する場合 (たとえば)、456 行目のコードを変更しても、123 行目までの結果には影響しないはずです (たとえば、456 行目への変更前と変更後を比較する場合)。おそらく私は何かを逃していますか?