Re: [問題] 記憶體配置混和型態

看板Python作者 (十年一夢)時間12年前 (2013/08/19 12:42), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1I4XBE9H (Python)
文章代碼(AID): #1I4XBE9H (Python)