python - 将指针传递给cython中的结构

标签 python c cython

我正在尝试为 MUMPS 求解器 (zmumps) 的复杂版本编写一个 cython 接口(interface)。我遇到了一些问题,因为我以前没有使用过 C 或 cython 的经验。以 pymumps package 为例我能够让代码 (dmumps) 的真实版本工作。

我认为我的问题是指向 ZMUMPS_COMPLEX 结构的指针。对于

到目前为止,我有以下内容(从 pymumps 大量提升):

zmumps_c.pxd:

from libc.string cimport strncpy

cdef extern from "mumps_c_types.h":

    ctypedef struct ZMUMPS_COMPLEX "ZMUMPS_COMPLEX":
        double   r
        double   i

cdef extern from "zmumps_c.h":

    ctypedef int MUMPS_INT

    ctypedef struct c_ZMUMPS_STRUC_C "ZMUMPS_STRUC_C":
        MUMPS_INT      sym, par, job
        MUMPS_INT      comm_fortran    # Fortran communicator 
        MUMPS_INT      n

        # Assembled entry
        MUMPS_INT      nz
        MUMPS_INT      *irn
        MUMPS_INT      *jcn
        ZMUMPS_COMPLEX *a

        # RHS and statistics 
        ZMUMPS_COMPLEX *rhs
        MUMPS_INT      infog[40]

    void c_zmumps_c "zmumps_c" (c_ZMUMPS_STRUC_C *)

zmumps_c.pyx

cdef class ZMUMPS_STRUC_C:
    cdef c_ZMUMPS_STRUC_C ob

    property sym:
        def __get__(self): return self.ob.sym
        def __set__(self, value): self.ob.sym = value
    property par:
        def __get__(self): return self.ob.par
        def __set__(self, value): self.ob.par = value
    property job:
        def __get__(self): return self.ob.job
        def __set__(self, value): self.ob.job = value
    property comm_fortran:
        def __get__(self): return self.ob.comm_fortran
        def __set__(self, value): self.ob.comm_fortran = value
    property n:
        def __get__(self): return self.ob.n
        def __set__(self, value): self.ob.n = value
    property nz:
        def __get__(self): return self.ob.nz
        def __set__(self, value): self.ob.nz = value
    property irn:
        def __get__(self): return <long> self.ob.irn
        def __set__(self, long value): self.ob.irn = <MUMPS_INT*> value
    property jcn:
        def __get__(self): return <long> self.ob.jcn
        def __set__(self, long value): self.ob.jcn = <MUMPS_INT*> value
    property a:
        def __get__(self): return <long> self.ob.a
        def __set__(self, long value): self.ob.a = <ZMUMPS_COMPLEX*> value
    property rhs:
        def __get__(self): return <long> self.ob.rhs
        def __set__(self, long value): self.ob.rhs = <ZMUMPS_COMPLEX*> value

    property infog:
        def __get__(self):
            cdef MUMPS_INT[:] view = self.ob.infog
            return view


def zmumps_c(ZMUMPS_STRUC_C s not None):
    c_zmumps_c(&s.ob)

在我的 python 代码中,我可以使用以下方法设置 irn 和 jcn

import zmumps_c
import numpy as np

MUMPS_STRUC_C = staticmethod(zmumps_c.ZMUMPS_STRUC_C)
id = MUMPS_STRUC_C()
x = np.r_[1:10]
id.irn = x.__array_interface__['data'][0]

但是,我不知道如何设置 a 或 rhs 的值。任何帮助将不胜感激。

最佳答案

这可能有帮助:

The following example lets you get at the C-level members of Python’s built-in “complex” object:

cdef extern from "complexobject.h":

    struct Py_complex:
        double real
        double imag

    ctypedef class __builtin__.complex [object PyComplexObject]:
        cdef Py_complex cval

# A function which uses the above type
def spam(complex c):
    print "Real:", c.cval.real
    print "Imag:", c.cval.imag

抓自 here .

由于 ZMUMPS_COMPLEX 和内置的 Py_complex 结构具有完全相同的结构,您应该能够通过在这两种类型之间创建桥梁(使用 typedef 和/或强制转换或将 Py_complex 转换为 ZMUMPS_COMPLEX 的函数)...

我很乐意提供更多帮助,但我目前没有安装腮腺炎...

关于python - 将指针传递给cython中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19806494/

相关文章:

python - Cython 指令 no_gc 的用法

python - 如何使用 Cython 将外部 C 函数导入 IPython Notebook?

python - 在不同的文件夹中运行另一个 Python 脚本

python - 是否可以在 django admin 中实现 "change password at next logon"类型的功能?

c - 参数列表是否将字符串引号传递给 C 中的 exec 命令?

c++ - 轻量级 Windows 应用程序的最佳开源示例是什么?

C-Compiler 在将字符串分配给 char 数组时说 "Cannot convert char * to char"

python - Cython 安装问题

python - 使用 reduce() 的有用代码?

python - 编写通用 getattr() 并根据 attr 名称填充方法参数