最近加班做了一个项目,在程序中使用Fget32函数来获取一个receive buffer的时候,程序报错:LIBFML_CAT:3: ERROR: No space in fielded buffer,初步查看程序没发现什么明显问题。
求助于万能的官方文档,但是很含糊:
An attempt was made to add a field to a buffer, change a field to a larger value within a buffer, merge two buffers, or otherwise modify a buffer, and not enough space is available to complete the operation.
建议解决办法是:
Use Frealloc dynamically to allocate a larger buffer or use Fcpy to copy the buffer to a larger buffer, and retry the operation。
让我去查看Fcpy(3fml), Frealloc(3fml)这两个函数,这是肿么啦?我是取返回的buffer难道空间不够?直接查看了tpalloc函数,发现小小的返回buffer不至于连续发5笔就空间不够了,再次查看了Fget32函数:
if( Fget32( rcvbuf, BUFFER, 0, strRcvBuffer, &fldLen)== -1){
lr_log_message("get BUFFER failed. [%d: %s]\n", Ferror32, Fstrerror32(Ferror32) );
}
if( fldLen > 1024 ) {
strRcvBuffer[1023] = 0;
}
难道是strRcvBuffer不够?设置更大也不管用,单步运行是可以的,连续发5笔就不行了,百思不得其解。
后来只有求助于万能的度娘、谷姐了,首先参考了Fget32的原型函数,修改第5位参数为0,程序连续调试通过,更加迷茫了,第5位参数不就是一个maxlen吗?咋会出现不要送,让它默认赋值buffer长度就可以了呢?
经反复测试发现,fldLen这个参数被Fget32赋值后,如果你上一次返回的存取长度大于本次返回存取长度,那是没有问题的,如果你上一次返回的存取长度小于本次返回存取长度,哈哈,你就等着中标吧?LIBFML_CAT:3: ERROR: No space in fielded buffer,解决这个问题的办法就是:
1.第5位参数赋值为0,让它每次自动给出长度
2.第5位参数使用前,一定要让他初始化
搞得我好辛苦,星期天加班,星期一凌晨发博文!上海,注定不是该来的地方啊!
--转自