0

这是我的最小示例代码。

import ctypes as c
import numpy as np
import subprocess

## the c code
c_code = """  
#include<string.h>
#include<stdlib.h>
typedef struct My_Struct_{
    int n;
    float *b;

}My_Struct;

My_Struct *my_struct_new(int n) {
    My_Struct *result = malloc(sizeof *result);
    result->n = n;
    result->b = malloc(n*sizeof result->b[0]);
    memset(result->b,1.0,n*sizeof result->b[0]);
    return result;
}
"""
## creating the so file
with open('temp.c', 'w') as f:
    f.write(c_code)
cmmd = "gcc -std=c99 -lm -shared -o temp.so -fPIC temp.c -lm -Wall -pedantic"
print subprocess.call(cmmd, shell=True)

## importing the so file
c_foo=c.cdll.LoadLibrary("./temp.so")
n = 5

class My_Struct(c.Structure):
 _fields_= [("n",c.c_int),
            ("b",c.POINTER(c.c_float*n))]
my_struct_new = c_foo.my_struct_new
my_struct_new.argtype = [c.c_int]
my_struct_new.restype = c.POINTER(My_Struct)

## creating the struct
p_my_struct = my_struct_new(n)

# trying to read from the struct
print p_my_struct.contents.b[0]
print np.ctypeslib.as_array(p_my_struct.contents.b, (n,1))

但不是预期的

[[1.0, 1.0, 1.0, 1.0, 1.0]]

我得到:

<__main__.c_float_Array_5 object at 0x35fe3b0>
[[]
 [�@�^]
 [��A��������]
 [`��J�]
 [t*Op]]
4

1 回答 1

1

您传递了一个指针而不是数组。应该是as_array(p_my_struct[0].b[0], (n, 1))

注释:

  • 你有一个错字。它应该argtypes带有s。
  • memset设置一个char值,所以每个值都是c_float.from_buffer(bytearray('\1\1\1\1')) == 2.3694278276172396e-38.
  • 如果要将值作为 Python list,请使用p_my_struct[0].b[0][:].
于 2013-11-05T15:28:57.540 回答