我需要帮助才能了解某些旧C代码中发生了什么。
我正在使用旧的btree / isam软件产品(来自Softfocus)将我的数据写入数据库。它主要将数据放入mydb.dt
文件,将索引数据放入mydb.nx
(例如)。
在我的程序中,我有一个结构,其成员对应于"字段"在数据库中。结构的定义是这样的(我用虚构的数据大大简化了):
typedef struct {
unsigned char name[50]; /*size is 50 bytes*/
int active; /*size is 4 bytes*/
int yet_unused_bytes[46]; /*unused space (in fixed-length record)*/
} DB_PEOPLE; /*total struct size is 100 bytes*/
当我想写入记录时,我会像这样调用数据库软件的bt3Write
例程(people_db_fd
是我的数据库文件的描述符,{{1只是上面我的结构的副本,其中包含数据):
db_current_record_people
ret = bt3Write(people_db_fd, db_current_record_people);
例程基本上如下(我不认为确切知道它做了什么很重要,但关键部分是trueBase位)。 bt3Write
是数据库文件,fd
是字节流(我上面提到的data
结构)。我认为db_current_record_people
只是我在这里不关心的nx文件的一些开销,recno
负责:
lioWrite
在标头文件中,/*
* all the keys are in; write the data record and store a copy
*/
if (lioWrite(fd -> fdData, recno, trueBase(data)) == UERROR)
return (sfuint) isMuCallErr(BT3WRITE, 0);
和trueBase
被定义为以下宏:
BASEOFFSET
现在,这就是我想要帮助的东西(我绝不是C专家......实际上几乎没有功能)。我需要知道trueBase正在做什么(或者你最好的猜测)。对于我未经训练的眼睛,似乎它将指针移动到BASEOFFSET的长度(我的系统上是8个字节)。
对于对此特定软件产品一无所知的人,可获得额外奖励积分!它已经很老了,我无法真正找到它的任何文档。它的评论相当不错 - 除了这一点。
答案 0 :(得分:1)
您的分析是正确的。它们看起来好像是在他们正在进行的每个分配中存储一些隐藏的头数据。所以他们只给你一个指向“用户”部分的指针。例如,只有当您需要free
数据时,您才需要知道所分配空间的“真实”起点,这就是宏计算的内容。
我不申请加分,因为我不知道那是什么。