C言語コードが出力される可能性のある箇所一覧
1. joutput_initialize_fp (2246-2252行目)
COMP-1 または COMP-2 を使ったときに出てくるコードだが、現在parserでエラーを出すようにしているので、対応不要と判断した。COMP-1, COMP-2を実装するときにここを修正することにする。
詳細
joutput("{float temp = 0.0;"); // C変数宣言
joutput(" LIBCOB.memcpy ("); // C関数呼び出し
joutput(", (char *)&temp, sizeof(temp));}\n"); // キャスト, &演算子, sizeof
問題: {float temp = 0.0;}, (char *)&temp, sizeof(temp) はすべてC固有の構文。
2. joutput_data — CB_TAG_CAST ケース (963行目)
joutput("&");
joutput_param(x, 0);
問題: & (アドレス演算子) はJavaに存在しない。
3. joutput_data — CB_TAG_INTRINSIC ケース (967行目)
詳細
joutput("module.cob_procedure_parameters[%d]->data", field_iteration);
問題: -> (アロー演算子) はC固有。Javaでは . を使う。
4. joutput_integer — CB_USAGE_POINTER ケース (1328-1330行目)
詳細
joutput("(*(unsigned char **) (");
joutput_data(x);
joutput("))");
問題: unsigned char ** 型キャストとポインタデリファレンス * はC固有。
5. joutput_param — CB_ALPHABET_CUSTOM ケース (1605行目)
詳細
joutput("&%s%s", CB_PREFIX_FIELD, rbp->cname);
問題: & (アドレス演算子)。
6. joutput_initialize_literal (2216行目)
詳細
joutput_data(x);
joutput("memcpy (");
問題: .memcpy( ではなく memcpy ( と出力されるため、Javaのメソッド呼び出しとして不正。他の箇所 (2228行目等) では正しく .memcpy(となっている。
7. joutput_initialize_one — flag_chained ケース (2316-2318行目)
詳細
joutput("cob_chain_setup (");
joutput_data(x);
joutput(", %d, %d);\n", f->param_num, f->size);
問題: cob_chain_setup はC版ランタイム (libcob) の関数。Java側に対応する実装が必要。
8. joutput_call — void * ポインタ宣言 (2830, 2835行目)
詳細
joutput_line("void *ptr_%d;", (int)n);
問題: void * はC固有のポインタ型。Javaに存在しない。
9. joutput_call — &ptr_N (3041, 3052行目)
詳細
joutput("&ptr_%d", (int)n);
問題: & (アドレス演算子) + #8 で宣言した void * 変数への参照。
10. joutput_call — CALL BY VALUE の型キャスト (3097-3159行目)
詳細
joutput("(unsigned "); // "unsigned" はJavaに存在しない
...
joutput("char"); // → "(unsigned char)" — Javaに存在しない型
joutput("short"); // → "(unsigned short)"
joutput("int"); // → "(unsigned int)"
joutput("long long"); // → "(unsigned long long)" — "long long" はC固有
問題: unsigned 修飾子と long long 型はJavaに存在しない。
11. joutput_call — ポインタデリファレンス (3170-3172行目)
詳細
joutput("*(");
joutput_data(x);
joutput(")");
問題: *(...) はCのポインタデリファレンス。
12. joutput_base — unsigned char * 変数宣言 (873-878行目)
詳細
joutput_local("unsigned char\t\t*%s%s = NULL;", CB_PREFIX_BASE, name);
joutput_local("static unsigned char\t*save_%s%s;\n", CB_PREFIX_BASE, name);
joutput_local("unsigned char\t*%s%s = NULL;", CB_PREFIX_BASE, name);
問題: unsigned char * はC固有のポインタ型宣言。NULL もJavaでは null。
13. joutput_base の cb_field_variable_address(f) が有効になるときの処理
分類まとめ
| カテゴリ |
該当箇所 |
ポインタ演算 (&, *, void *, unsigned char *) |
2, 4, 5, 8, 9, 11, 12 |
C固有の型 (unsigned, long long) |
4, 10, 12 |
C固有の演算子/関数 (sizeof, ->) |
1, 3 |
C版ランタイム関数 (cob_chain_setup, LIBCOB.memcpy) |
1, 7 |
メソッド呼び出し構文の誤り (. の欠落) |
6 |
C言語コードが出力される可能性のある箇所一覧
1.
joutput_initialize_fp(2246-2252行目)COMP-1またはCOMP-2を使ったときに出てくるコードだが、現在parserでエラーを出すようにしているので、対応不要と判断した。COMP-1,COMP-2を実装するときにここを修正することにする。詳細
問題:
{float temp = 0.0;},(char *)&temp,sizeof(temp)はすべてC固有の構文。2.
joutput_data—CB_TAG_CASTケース (963行目)問題:
&(アドレス演算子) はJavaに存在しない。3.
joutput_data—CB_TAG_INTRINSICケース (967行目)詳細
問題:
->(アロー演算子) はC固有。Javaでは.を使う。4.
joutput_integer—CB_USAGE_POINTERケース (1328-1330行目)USAGE POINTERfields #802 で解決詳細
問題:
unsigned char **型キャストとポインタデリファレンス*はC固有。5.
joutput_param—CB_ALPHABET_CUSTOMケース (1605行目)MOVEstatements #807 で解決詳細
問題:
&(アドレス演算子)。6.
joutput_initialize_literal(2216行目)VALUE ALLliteral initialization #790 で解決詳細
問題:
.memcpy(ではなくmemcpy (と出力されるため、Javaのメソッド呼び出しとして不正。他の箇所 (2228行目等) では正しく.memcpy(となっている。7.
joutput_initialize_one—flag_chainedケース (2316-2318行目)PROCEDURE DIVISION CHAINING#796 で解決詳細
問題:
cob_chain_setupはC版ランタイム (libcob) の関数。Java側に対応する実装が必要。8.
joutput_call—void *ポインタ宣言 (2830, 2835行目)CALLwithADDRESS OFarguments #808詳細
問題:
void *はC固有のポインタ型。Javaに存在しない。9.
joutput_call—&ptr_N(3041, 3052行目)CALLwithADDRESS OFarguments #808詳細
問題:
&(アドレス演算子) + #8 で宣言したvoid *変数への参照。10.
joutput_call— CALL BY VALUE の型キャスト (3097-3159行目)CALL BY VALUEarguments #809詳細
問題:
unsigned修飾子とlong long型はJavaに存在しない。11.
joutput_call— ポインタデリファレンス (3170-3172行目)CALL BY VALUEarguments #809詳細
問題:
*(...)はCのポインタデリファレンス。12.
joutput_base—unsigned char *変数宣言 (873-878行目)LOCAL-STORAGE SECTION#815詳細
問題:
unsigned char *はC固有のポインタ型宣言。NULLもJavaではnull。13.
joutput_baseのcb_field_variable_address(f)が有効になるときの処理OCCURS DEPENDING ON#799 で解決分類まとめ
&,*,void *,unsigned char *)unsigned,long long)sizeof,->)cob_chain_setup,LIBCOB.memcpy).の欠落)