15-1 STACK 的处理
INFORMIX-4GL 和C之间数据的传送,是利用数据结构中 stack 的技巧来达成两者之间的运作。
<语法格式>
CALL function_name(arg1,arg2,...argn)
15-2 呼叫的协议
.当 informix-4gl 呼叫C时,会将函数中的参数由左至右压入(PUSH) STACK中 ,并把参数的个数也传给C。而C必须在 STACK 中依相反的次序 POP 所有的参数。
.当C欲传回变量给 informix-4gl 时,参数的压入顺序必须与 4gl 中 returning参数的顺序相同。也就是说,无论是在个数或数据型态都必须和 returning 参数的顺序一致。
15-3 4GL与C的界面函数
┌──────┬─────┬──────────┬──────────────┐
│ 数据型态 │ 定义 │ POPPING 函数 │ PUSHING 函数 │
├──────┼─────┼──────────┼──────────────┤
│ int │ i │ popint(&i) │ retint(i) │
│ short │ s │ popshort(&s) │ retshort(s) │
│ long │ l │ poplong(&l) │ retlong(l) │
│ float │ f │ popflo(&f) │ retflo(&f) │
│ double│ d │ popdub(&d) │ retdub(&d) │
│ char │ str[m] │ popquote(str,m)│ retquote(str) │
└──────┴─────┴──────────┴──────────────┘
记得在C中的最后一行叙述要加一个 return,而在 return 中唯一的参数是用来传递欲被传回的个数,即使没有传回参数也要 return(0)。
§例:
CALL bankopen(account_no,3,salary,"bankdisk.txt")
#include <stdio.h>
FILE *fopen(), *fp;
static int Is_Open = 1;
static int serial_no = 0;
bankopen(n)
int n;
{
int net_income,summary_ty,i,j,len;
char account_no[8],a[8],bank_file[12],open_file[12];
serial_no++;
if (n != 4)
exit(1);
popquote(bank_file,12);
popint(&net_income);
popint(&summary_ty);
popquote(account_no,8);
len = strlen(bank_file);
if (Is_Open) {
fp = fopen(bank_file,"w");
Is_Open = 0;
}
fprintf(fp," %06d 03",serial_no);
len = strlen(account_no);
for (i = 0; i < len; i++)
if (isdigit(account_no[i])) {
a[i] = account_no[i];
}
else {
a[i] = '\0';
break;
}
len = 7 - strlen(a);
for (i = 0; i < len; i++)
fprintf(fp,"0");
fprintf(fp,"%s ",a);
switch (summary_ty) {
case 1 : fprintf(fp,"PM");
break;
case 2 : fprintf(fp,"PR");
break;
case 3 : fprintf(fp,"TH");
break;
}
if (net_income > 0)
fprintf(fp," C %08d\n",net_income);
else
fprintf(fp," D %08d\n",net_income);
return 0;
}