作者sbrhsieh (十年一梦)
看板Python
标题Re: [问题] 记忆体配置混和型态
时间Mon Aug 19 20:42:51 2013
※ 引述《montasena (没用的好人)》之铭言:
: 小的新手
: 不知道如何实现这种方式
: 比方说
: from ctypes import *
: a=(c_byte*5)()
: a表示有5个阵列 形式是byte
: 但假设我想要a有10个阵列
: 一半是c_byte 一半是c_short
: 不知道怎样去实现这种方法
: 试了很久 暂时都没办法解决
: 有人知道怎样实现吗?
我猜测你的需求主要是两个 array 在 memory layout 上是连续的。
这有许多种作法可以考虑。
1. allocate 15 bytes 的 c_byte array,然後透过一个 c_short pointer 去
access 後面 10 bytes 空间(视为一个 length=5 的 c_short array)。
A = (c_byte * (5+sizeof(c_short)*5))()
B = cast(addressof(A)+5, POINTER(c_short))
for x in xrange(5):
A[x] = x * 2
B[x] = x * x
print list(A) # [0, 2, 4, 6, 8, 0, 0, 1, 0, 4, 0, 9, 0, 16, 0]
缺点是不能使用 array type 提供的长度资讯与 boundary check(pointer type
不会检查 boundary)。
2. 把不同 element type array 全放在同一个 structure 里。
class MyArray(Structure):
_pack_ = 1 # 如果你不想要有任何 padding
_fields_ = [
('array1', c_byte * 5),
('array2', c_short * 5),
]
arr = MyArray()
稍微修改你的演算法,把 access 前五个 element 的部分(arr[0]~arr[4])改成
arr.array1[0]~arr.array1[4],arr[5]~arr[9] 的部分改成 arr.array2[0]~
arr.array2[4]。
3. 不同 element type array 全放在同一个 structure 里,并模拟成 list 使用。
class MyArray(Structure):
_pack_ = 1
_fields_ = [
('array1', c_byte * 5),
('array2', c_short * 5),
]
def _to_integer_(self, key):
if isinstance(key, (int, long)):
return key
raise TypeError("index MUST be integral type")
def __len__(self):
return len(self.array1) + len(self.array2)
def __getitem__(self, key):
n = self._to_integer_(key)
return self.array1[n] if n < len(self.array1) else self.array2[n - len(self.array1)]
def __setitem__(self, key, value):
n = self._to_integer_(key)
if n < len(self.array1):
self.array1[n] = value
else:
self.array2[n - len(self.array1)] = value
arr = MyArray()
for x in xrange(len(arr)):
arr[x] = x * x
print list(arr) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
不过,我对於你的需求的必要性感到存疑。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.173.236.143