Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIG无法正确处理64位c指针_C_Tcl_Swig_32bit 64bit - Fatal编程技术网

SWIG无法正确处理64位c指针

SWIG无法正确处理64位c指针,c,tcl,swig,32bit-64bit,C,Tcl,Swig,32bit 64bit,我有一些C-API将由tcl脚本调用。我使用SWIG包装C-api。但是当我在64位平台上运行脚本时,tcl进程会崩溃。SWIG似乎未正确处理c指针。详情见下文 这是我的C-API,它非常简单 MsgHeader_t * headerGet(void) { printf("*********** headerGet in capis_swig.c: %p\n", &currHeader); return &currHeader; } 以下是SWIG生成的

我有一些C-API将由tcl脚本调用。我使用SWIG包装C-api。但是当我在64位平台上运行脚本时,tcl进程会崩溃。SWIG似乎未正确处理c指针。详情见下文

这是我的C-API,它非常简单

MsgHeader_t *
headerGet(void)
{
    printf("***********     headerGet in capis_swig.c: %p\n", &currHeader);
    return &currHeader;
}
以下是SWIG生成的capis_wrap.c中的相关代码:

SWIGINTERN int
_wrap_headerGet(ClientData clientData SWIGUNUSED, Tcl_Interp *interp, 
int objc, Tcl_Obj *CONST objv[]) {
  MsgHeader_t *result = 0 ;

  if (SWIG_GetArgs(interp, objc, objv,":headerGet ") == TCL_ERROR) SWIG_fail;
  printf("***********     begin to call C-API headerGet\n");
  result = (MsgHeader_t *)headerGet();
  printf("***********     headerGet in capis_wrap.c: %p\n", result);
  Tcl_SetObjResult(interp, 
      SWIG_NewInstanceObj( SWIG_as_voidptr(result), SWIGTYPE_p_MsgHeader_t ,0));
  return TCL_OK;
fail:
  return TCL_ERROR;
}
以下是控制台中的输出:

*********** Line 268: 0 : msgHeader 
***********     begin to call C-API headerGet
***********     headerGet in capis_swig.c: 0x7f8bfc507290
***********     headerGet in capis_wrap.c: 0xfffffffffc507290
...
Segmentation fault (core dumped)
据介绍,SWIG-1.3.22具有64位TCL支持功能。我尝试了32位版本1.3.38和64位版本3.0.10,但两个版本的崩溃情况相同。我是否错过了启用64位支持的功能

顺便说一句,我的tcl是8.5.19 64位,代码在32位平台上运行良好


问题似乎在于SWIG无法正确处理64位c指针。我不熟悉swig。如果有人能提供帮助,我将不胜感激。

您生成的源代码没有看到headerGet的声明

确保您有一个正确声明headerGet的头文件,并在.i文件中放入include指令:

%module headerGet
%{
#include "headerGet.h"
%}

你能发一封邮件吗?看来你的capis_wrap.c中没有声明headerGet。这是非法的,不起作用。您需要指示SWIG包含一个带有headerGet声明的适当头文件。为了修复编译错误,您永远不应该使用强制转换。很抱歉,我不能发布最小、完整且可验证的示例。这是一个很难满足的要求。你需要想出一种方法让别人重现你的问题。如果你正在做的项目太大,创建一个完全独立的小项目,并在那里重现你的问题。谢谢你的回复。很抱歉,我无法发布最小、完整且可验证的示例。这些代码片段来自一个大型项目。很难把他们分开。实际上headerGet是在capis_swig.h中声明的,它是生成capis_wrap.c时的一个输入,在Makefile中,我有这样一个:capis_wrap.c:capis_swig.h swig-includeal-ignoremissing-warn=0-w201302305-tcl8-o capis_wrap.c如果不能重现您的问题,就不可能取得进展。想办法,谢谢你。添加include后,它可以正常工作。再次感谢。