使用 SWIG,取消引用指向 TCL 变量的 C 数组指针

Using SWIG, dereference a C array pointer to a TCL variable

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

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

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

PS:我对SWIG不是很了解

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

根据你的解释,我很难说出你到底想达到什么目的。也许一些伪代码会让事情变得更清楚。我是 Python 的 SWIG 用户,对 TCL 一无所知,因此我将尝试解释我将如何使用我的设置执行此操作。

假设这是被包装的函数:

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

您希望函数的 return 值为 "dereferenced"。因此,您希望函数 return 不是指针。在 python 中,假设我想要 return 一个 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 ([i]); 
        // denotes return variable before SWIG wrapping goodness 
        PyList_SetItem ($result,j,o);
    }
}

如您所见,大部分代码确实在 C/C++ 中,因此我拿 Python 示例并不重要。您只需查看 TCL/C API 即可确定您需要哪些功能。

希望对您有所帮助!