Re: [問題] 記憶體配置混和型態
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):