我让C和C两个函数做完全相同的事情.唯一的区别是它们的返回类型和第一个参数类型:
int func1(int a, int *b) {
if (a > 0) {
*b = 0;
return 1;
}
*b = -1;
return 0;
}
double func2(double a, int *b) {
if (a > (double)0.0) {
*b = 0;
return 1.0;
}
*b = -1;
return (double)0.0;
}
将它们汇编到库中:
gcc -c -static -o testlib.o testlib.c
下面的COBOL代码调用这两个函数:
IDENTIFICATION DIVISION.
PROGRAM-ID. CallCFunctions.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAR-AI USAGE BINARY-SHORT SIGNED.
01 VAR-BI USAGE BINARY-SHORT SIGNED.
01 VAR-CI USAGE BINARY-SHORT SIGNED.
01 VAR-AD USAGE BINARY-DOUBLE.
01 VAR-BD USAGE BINARY-DOUBLE.
01 VAR-CD USAGE BINARY-DOUBLE.
PROCEDURE DIVISION.
MOVE 1 TO VAR-AI.
MOVE -10 TO VAR-BI.
MOVE ZERO TO VAR-CI.
CALL "func1" USING BY VALUE VAR-AI BY REFERENCE VAR-BI
RETURNING VAR-CI
DISPLAY "Calling 'func1'".
DISPLAY "A = ", VAR-AI, " B = ", VAR-BI, " C = ", VAR-CI
MOVE 1 TO VAR-AD.
MOVE -10 TO VAR-BD.
MOVE ZERO TO VAR-CD.
CALL "func2" USING BY VALUE VAR-AD BY REFERENCE VAR-BD
RETURNING VAR-CD
DISPLAY "Calling 'func2'".
DISPLAY "A = ", VAR-AD, " B = ", VAR-BD, " C = ", VAR-CD
STOP RUN.
编译COBOL代码:
cobc -x -free -o test test.cbl testlib.o
第一个函数可以工作,但第二个函数会生成错误:
try 引用未分配的内存(信号SIGSEGV) 全额输出
Calling 'func1'
A = +00001 B = +00000 C = +00001
Calling 'func2'
attempt to reference unallocated memory (signal SIGSEGV)
有人能解释一下问题出在哪里吗?