使用 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 即可确定您需要哪些功能。
希望对您有所帮助!
场景。 我使用 软件 (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 即可确定您需要哪些功能。
希望对您有所帮助!