Recent Entries
Archives
Search


Links
Powered by
Movable Type 2.64

2008年05月29日

OpenCOBOLと変数の(2)

OpenCOBOLが吐きだしたCのソースを眺めてましたが(;´Д`)弄りにくいすぎる

という事で方針を大転換して、OpenCOBOL内の変数のアドレスと変数名をOpenCOBOLコード中から送るようにして、別途用意したCで書かれたサブルーチンにストックした値と差し替える方向でファイナルアンサーヽ(´ー`)ノ


CALL "GETVALUE" USING VARNAME0 "VARNAME0"
CALL "GETVALUE" USING VARNAME1 "VARNAME1"
CALL "GETVALUE" USING VARNAME2 "VARNAME2"
CALL "GETVALUE" USING VARNAME3 "VARNAME3"

みたいな感じで、WORKING-STORAGE SECTIONで定義してるすべての変数について値を取りに行ってみる等。上記はOpenCOBOL中では以下のように展開されるようです(部分):


/* TEST0001:41: CALL */
{
{
int (*func)();

module.cob_procedure_parameters[0] = &f_27;
module.cob_procedure_parameters[1] = &c_1;
module.cob_procedure_parameters[2] = NULL;
module.cob_procedure_parameters[3] = NULL;
module.cob_procedure_parameters[4] = NULL;
module.cob_procedure_parameters[5] = NULL;
module.cob_procedure_parameters[6] = NULL;
cob_call_params = 2;
func = cob_resolve_1 ((const char *)"GETVALUE");
(*(int *) (b_1)) = func (b_5 + 540, (unsigned char *)"VARNAME0");
}
}
/* TEST0001:43: STOP */

Cで書いたプログラム側には変数はポインタ渡しされますし、文字列リテラルももちろんポインタ渡し(そしてNULL終端)されます(参考:OpenCOBOL マニュアル -> C インターフェース : C プログラムへの静的リンク)
たった1個のCALLでも清々しいほど重そうな処理ですね(;´Д`)。こんなのが変数分だけ(つまり数百個も!)並びそうですがコンパイラの最適化に任せましょう(;´Д`)不要な変数の引き渡しについては最適化も可能なわけですから、それは将来の課題として。

 で、C言語ではかせて弄り倒すよりも(外見は)シンプルになりますから、説明はしやすいんじゃないかと思います。魔術的なコードやトリック、カラクリで稼働させるよりは良いんじゃないかとかなんとか。

Posted by minemaz at 2008年05月29日 12:29
トラックバック
このエントリーのトラックバックURL:
http://www.lancard.com/mt/mt-tb.cgi/438

Comments
Post a comment









Remember personal info?