TCL脚本无法保留从C-API返回的64位指针

TCL脚本无法保留从C-API返回的64位指针,tcl,swig,32bit-64bit,Tcl,Swig,32bit 64bit,我有一个旧的TCL脚本,在32位机器上运行良好,但在64位机器上出现“分段错误”。脚本如下: ... set msgHeader [ headerGet ] setAnswerMessageHeader $cmd 0x00 $msgHeader ... static MsgHeader_t currHeader; MsgHeader_t * headerGet(void) { printf("*********** headerGet: %p\n", &currHea

我有一个旧的TCL脚本,在32位机器上运行良好,但在64位机器上出现“分段错误”。脚本如下:

...
set msgHeader [ headerGet ]
setAnswerMessageHeader $cmd 0x00 $msgHeader
...
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;
}
这里headerGet和setAnswerMessageHeader是C-API,如下所示:

...
set msgHeader [ headerGet ]
setAnswerMessageHeader $cmd 0x00 $msgHeader
...
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将地址0x7f86ab50edb0返回给msgHeader变量,但当TCL将其传递给setAnswerMessageHeader时,地址完全错误。看起来只保留了加法的最后四个字节(0xab50edb0前两个(0x7f86)丢失

顺便说一句:我的tcl版本是8.5


我不熟悉TCL/TK。有人知道为什么会发生这种情况,以及如何解决它吗?

问题在于您正在使用的SWIG的构建,因为它将指针视为32位值(这会丢弃那些有效位)。您需要SWIG理解它必须生成64位感知代码,以便正确映射指针。

问题在于您正在使用的SWIG的构建中,它将指针视为32位值(这会丢弃那些有效位)。您需要SIG来理解它必须生成64位的代码,以便指针正确地映射。< / P>您使用什么来在C++代码和TCL代码之间建立绑定层?我问是因为那是虫子的地方…它是SWIG。我检查了我的环境,发现它是32位的。所以也许这就是原因。我将更新它并再次运行。谢谢你的“Apple”,它实际上给了我一个指导。你用什么来制作C++代码和TCL代码之间的绑定层?我问是因为那是虫子的地方…它是SWIG。我检查了我的环境,发现它是32位的。所以也许这就是原因。我将更新它并再次运行。谢谢你的“询问”,这实际上给了我一个方向。谢谢你的回复。知道如何使SWIG生成64位代码吗?谢谢回复。知道如何使SWIG生成64位代码吗?