32 비트 시스템에서 잘 실행되는 오래된 TCL 스크립트가 있지만 64 비트 시스템에서 '분할 오류'가 발생했습니다.이 스크립트는 다음과 같습니다.TCL 스크립트는 C-API에서 반환 된 64 비트 포인터를 유지할 수 없습니다.
*********** headerGet: 0x7f86ab50edb0
*********** setAnswerMessageHeader, cmd=0x337c950, cmdFlags=0, hdr=0xffffffffab50edb0
,617 : 여기
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 비트 시스템 내 디버그 출력 :
...
set msgHeader [ headerGet ]
setAnswerMessageHeader $cmd 0x00 $msgHeader
...
여기 headerGet 및 setAnswerMessageHeader이 같다 C-API에 있습니다
그래서 문제는 : headerGet은 msgHeader 변형에 주소 0x7f86 ab50edb0을 반환하지만 TCL이 setAnswerMessageHeader에 전달할 때 주소가 완전히 잘못되었습니다. addess의 마지막 4 바이트 (0x ab50edb0) 만 유지되는 것처럼 보입니다. 첫 번째 두 개 (0x7f86)는 (는)입니다.
은 BTW : 내 TCL 버전 8.5
내가 TCL/TK와 unfamliar 생각입니다. 왜 이런 일이 일어나고 그것을 고치는지를 아는 사람이 있습니까?
C++ 코드와 Tcl 코드 사이에 바인딩 계층을 만들기 위해 무엇을 사용하고 있습니까? 그게 버그가있는 곳이기 때문에 묻습니다. –
It 's SWIG. 내 env에서 체크하고 그것이 32 비트라는 것을 알았다. 어쩌면 그게 원인 일 수도 있습니다. 나는 그것을 업데이트하고 다시 달릴 것이다. 실제로 나에게 방향을 제시하는 'ask'에 감사드립니다. –