【问题标题】:Using SWIG, dereference a C array pointer to a TCL variable使用 SWIG,取消引用指向 TCL 变量的 C 数组指针
【发布时间】:2015-09-05 18:31:35
【问题描述】:

场景。我使用了一个软件 (A),它允许我使用 TCL 脚本 (B)。由于我必须在 B 中执行许多操作,因此我构建了一个 C 代码 (C) 以通过 SWIG 使用并进行数学计算。现在,我正在并行运行 A,并且可以使用 A 的一些内置 TCL 函数通过 MPI 发送和接收 B 的一些变量。 问题是其中一个变量实际上是一个 C 数组。

我知道 SWIG 只在 C 和 TCL 之间交换内存地址,但是将它发送到另一台计算机是没有用的。所以我认为我必须将数组取消引用到 TCL 变量中。

有人可以告诉我如何做到这一点吗?

PS:我对 SWIG 了解不多。

【问题讨论】:

    标签: c arrays tcl swig


    【解决方案1】:

    typemaps 是去这里的方式。它们本质上允许您做的是向 SWIG 提供添加到包装器顶部和底部的代码 sn-ps。换句话说,您可以控制如何解析参数以及在操作完成后如何清理。

    根据您的解释,我很难说出您想要达到的具体目标。也许一些伪代码会让事情变得更清楚。我是使用 Python 的 SWIG 用户,对 TCL 一无所知,所以我将尝试解释如何使用我的设置来做到这一点。

    假设这是被包装的函数:

    double[] foo_c (double bar[], int a_size);

    您希望函数的返回值被“取消引用”。所以你希望函数返回非指针。在 python 中,假设我希望函数返回一个 Python 列表。

    typemap(out) double[] foo_c //signature of function whose behavior is to be modified
    {
        $result = PyList_New (a_size); //$result is what SWIG will return
        for (int i=0; i<a_size; ++i) {
            PyObject *o = PyFloat_FromDouble ($1[i]); 
            //$1 denotes return variable before SWIG wrapping goodness 
            PyList_SetItem ($result,j,o);
        }
    }
    

    如您所见,大部分代码实际上都是 C/C++ 中的,所以我举一个 Python 示例并不重要。您只需要查看 TCL/C API 即可确定您需要哪些功能来实现您的目的。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-03-25
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多