2017-06-21 93 views
0

ctypes可以用指針算術嗎?python ctypes指針算術

首先,讓我告訴你我想用C

#include <stdio.h> 

struct Foo { 
short *Bar; 
short *end_Bar; 
}; 

int main() { 
    short tab[3] = {1,2,3}; 
    struct Foo foo; 
    foo.Bar = tab; 
    foo.end_Bar = foo.Bar + 2; // Pointer arithmetic 
    short *temp = foo.Bar; 
    while(temp != foo.end_Bar) 
    printf("%hi", *(temp++)); 
    printf("%hi", *(foo.end_Bar)); 
    return 0; 
} 

現在你明白我在做什麼是創建整數數組,並在參考兩個指針保持在結構。一個指針在開始,一個在末尾,而不是保持第一個指針和數組的長度。

現在在Python我有繼承ctypes.Structure並且作爲兩個件,它們是ctypes.POINTER(ctypes.c_short)類型的對象。

import ctypes 

class c_Foo(ctypes.Structure): 
    _fields_ = [ 
     ("Bar", ctypes.POINTER(ctypes.c_short)), 
     ("end_Bar", ctypes.POINTER(ctypes.c_short)) 
    ] 

if __name__ == "__main__": 
    tab = [1,2,3] 
    foo = c_Foo() 
    foo.Bar = (c_short * len(tab))(*tab) 
    foo.end_Bar = foo.Bar + 2 # TypeError, unsupported operand 

所以現在的問題。是否可能用ctypes做指針運算?我知道你可以通過索引訪問數組的值,但我不想那樣,因爲我不想在我的結構中引用長度。

+0

爲什麼?通過這樣做你會獲得什麼? – TemporalWolf

+0

這不是關於爲什麼,而是如何。這是一個簡單的例子來展示我想要的,而不是我所做的。 – Olivier

+0

我不同意......這似乎是[XY問題](https://meta.stackexchange.com/a/66378/344593)給我的。 – TemporalWolf

回答

3

這是令人費解,但這種計算一個c_short對象以字節tab共享其緩衝區偏移,然後得到它的指針:

from ctypes import * 

class c_Foo(Structure): 
    _fields_ = [ 
     ("Bar", POINTER(c_short)), 
     ("end_Bar", POINTER(c_short)) 
    ] 

tab = (c_short*3)(1,2,3) 
foo = c_Foo() 
foo.Bar = tab 
foo.end_Bar = pointer(c_short.from_buffer(tab,sizeof(c_short)*2)) 
print(tab[2]) 
print(foo.Bar[2]) 
print(foo.end_Bar[0]) 
tab[2] = 4 
print(tab[2]) 
print(foo.Bar[2]) 
print(foo.end_Bar[0]) 
3 
3 
3 
4 
4 
4 
+0

我認爲下一步對我來說,如果使用'c_short'的子類不是一個選項,那麼可以使用指向單位長度數組的指針,例如, 'foo.end_Bar = POINTER(tab._type_ * 1)(tab)[2]'。如果'tab'不再可用,你可以使用'foo.end_Bar = POINTER(foo.Bar._type_ * 1)(foo.Bar.contents)[2]'。 – eryksun