使用c和tcl时,使用Tcl_GetVar2从文件获取数据时出错

时间:2017-12-12 20:07:47

标签: c tcl

在c中使用Tcl_GetVar2的最佳方法是什么?

 axes   = (Axes*)   malloc(sizeof(Axes));
  axes->Xorientation = Tcl_GetVar2(interp, "axes", "XOrientation", TCL_GLOBAL_ONLY);

以轴为结构

typedef struct {
    double XvaleurMin;
    double XvaleurMax;
    double XRatio;
    char *Xorientation;
    double YvaleurMin;
    double YvaleurMax;
    double YRatio;
    char *Yorientation;
  } Axes;

这是一个例子,在解析带有缺失数据的数据文件时会出现执行错误。

例如执行

时出现分段错误
printf("axes->Yorientation %s\n",axes->Yorientation );

由于

1 个答案:

答案 0 :(得分:1)

虽然Tcl_GetVar2 API函数 返回char *,但您需要记住Tcl保留该指针的所有权:它可以并且将在以下时间解除分配它它的选择,可能是你下一个API调用。另外,你真的应该把它当作const char *;也不要修改该字符串(有一些历史原因导致我们没有使用const)。如果你想保留它,你需要立即复制它,这需要一些缓冲区管理工作,有很多方法可以实现它。

或者您可以使用Tcl_GetVar2Ex,它返回Tcl_Obj *,一个Tcl本机值引用。有了这些,你可以保留它们(只要你记得Tcl_IncrRefCount当它们这样做时,Tcl_DecrRefCount它们一旦你不再需要它们,你就可以了使用char *Tcl_GetString(后者还报告字符串中的字节数),随时从该值引用获取Tcl_GetStringFromObj(但仍然不应该修改)。 / p>

如果你真的有兴趣解析这个值意味着从一个小集合中选择某种字符串 - 我在解析某种“方向”属性时会有所期待 - 我强烈建议你看一下Tcl_GetIndexFromObj。这是为这类任务明确设计的,为你处理了许多方面,通常是为了适合自己而烦人的工作量。