我有一个旧的TCL脚本,它在32位机器上运行良好,但在64位机器上得到了“分段错误”。脚本是这样的:
...
set msgHeader [ headerGet ]
setAnswerMessageHeader $cmd 0x00 $msgHeader
...
这里headerGet和setAnswerMessageHeader是C-API,如下所示:
static MsgHeader_t currHeader;
MsgHeader_t *
headerGet(void)
{
printf("*********** headerGet: %p\n", &currHeader);
return &currHeader;
}
int
setAnswerMessageHeader(Msg_t * cmd, W8 cmdFlags, MsgHeader_t * hdr)
{
printf("*********** setAnswerMessageHeader, cmd=%p, cmdFlags=%d, hdr=%p\n", cmd, cmdFlags, hdr);
...
return RETURN_OK;
}
这是我在64位计算机上的调试输出:
*********** headerGet: 0x7f86ab50edb0
*********** setAnswerMessageHeader, cmd=0x337c950, cmdFlags=0, hdr=0xffffffffab50edb0
所以,问题是:headerGet将地址0x7f86 ab50edb0 返回给msgHeader变体,但是当TCL将其传递给setAnswerMessageHeader时,地址完全错误。看起来只保留了addess的最后四个字节(0x ab50edb0 )。 前两个(0x7f86)丢失。
BTW:我的tcl版本是8.5
我对TCL / TK不感兴趣。有没有人知道为什么会发生这种情况以及如何解决它?
答案 0 :(得分:0)
问题在于您正在使用的SWIG的构建,因为它将指针视为32位值(抛弃那些有效位)。您需要SWIG了解它必须生成64位感知代码,以便正确映射指针。