双精度浮点数
· 大写表示必要的字段,小写表示可选字段。当我们从缓冲区中获取字段时,这种差别非常重要。通过指定某个字段是否是强制输入字段,可以增强函数的错误处理能力。
虽然上述规则提供了大部分我们所需要的功能,但所提出的体系结构为扩充提供了无限的可能性。下边举几个例子:
· 可以使用带有字段类型的计数字段进一步明确并保持字段定义字符串较短。
· 可以添加括号将一组字段分组并指定一个常规的计数字段。例如:"2(cL)"与"ccLL"相同。
· 可以将FML数据类型分成子类,以创建应用程序专用的数据类型,例如日期、社会保险号等。
对于添加到缓冲区中的每一个字段,需要传递如下参数:
· FML字段ID
· 字段值
对于从缓冲区中获取的每个字段,需要传递如下参数
· FML字段ID
· 保存读取值的适当变量的指针。
· 上述变量的字节数
· 说明对该字段读取是否成功的整型变量的地址
代码实例
作为结论,我们简单地复习一下来自一个实际实现的一些代码段。这些例子的代码基础是一个C语言库,该库实现上述的FML API扩展功能。虽然此库包括几个函数,但我们集中在其中的两个函数――FmlGet (Fget的包装)和FmlAdd (Fadd的包装)上。这两个函数的原型如下:
int FmlGet ( char *pBuf, int iOcc, char *pzFldSpec, char *pzErrTxt, … );
int FmlAdd ( char **ppBuf, char *pzFldSpec, char *pzErrTxt, … );
这两个函数都允许传递多个FML字段。FmlAdd在内部管理存储器分配。为了保持应用程序接口简单,在原型函数中,用字符指针代替了FML缓冲区指针。这些函数在内部处理强制类型转换。
下述调用从一个缓冲区中获取一组字段:
iErrCd = FmlGet ( pFmlBuf,
0,
"LZz",
zErrMsg,
FLD_INV_NUM, &lInvNum, sizeof long, &iInvNumFound,
FLD_CUST_NM, zCustNm, size of zCustNm, &iCustNmFound,
FLD_INV_DESC, zInvDesc, sizeof zInvDesc, &iInvDescFOund );
前三个参数容易理解,并且加上了简单的注释。在此例中,字段定义字符串的值指定函数应该读取一个长整型字段、两个字符串类型字段,并且指定长整型字段和一个字符串类型字段是必要的输入。对于每个要读取的字段,调用包括4个参数。这些参数是:
· FML字段ID
· 接收读取数据的变量的地址
· 上述变量可以保存的数据的字节数
· 返回时,表明该字段读取是否成功的整型变量的地址。
下边给出的第二个调用的例子说明如何向一个缓冲区中添加多个字段。
iErrCd = FmlAdd ( &pFmlBuf,
"LZ",
zErrMsg,
FLD_INV_NUM, 100,
FLD_CUST_NM, "ABC Inc" );
第一个参数是一个缓冲区指针的指针。因为如果需要,这个函数重新为该缓冲区分配存储空间。第二和第三个参数与函数FmlGet相同。至于可变参数,对于每一个要添加的字段,这个函数只需要两个输入――字段ID和字段的值。
特别感谢Anthony Dolce技术上的帮助、工作上的鼓励,Shekhter对新想法的支持,Purnesh Rustagi、Srinivas Vemu、Padma Gundampa和Tribhuwan Kama的帮助与合作。谨以本文献给我的儿子Krishna和他的朋友。