2

我有以下代码:

库文件

struct Node {
    int index;
    char name[10];
};
void getAllNodes(Node array[]);

libtest.py

from ctypes import *

class Node(Structure):
    _fields_ = [("index", c_uint), ("name", c_char*10)]

lib = CDLL("/path/to/lib.so")

nodeCount = 5
NodeArray = Node * nodeCount
getAllNodes = lib.getAllNodes     
pointers = NodeArray()
getAllNodes(pointers)

casted = cast(pointers, POINTER(NodeArray))
for x in range(0, nodeCount):
    node = cast(casted[x], POINTER(Node))
    print "Node idx: %s name: %s" % (node.contents.index, node.contents.name)

我必须接近,因为索引 0 处的 Node 结构具有正确的值,但其余部分是乱码。我在错误地构建什么给我带来了问题?

4

1 回答 1

3

它不是一个指针数组。它是一组Node记录,在内存中连续排列。作为函数调用中的参数,数组的作用类似于Node *(指向第一项的指针)。调用后,您可以简单地迭代数组:

getAllNodes.argtypes = [POINTER(Node)]
getAllNodes.restype = None

nodeArray = (Node * nodeCount)()
getAllNodes(nodeArray)

例如:

>>> [node.name for node in nodeArray]
['node0', 'node1', 'node2', 'node3', 'node4']
于 2013-05-23T09:32:33.447 回答