2015-04-07 3 views
1

Я создаю очень простой (охват) unittest для (аппаратного) C-интерфейса в python.Получение адреса конечной памяти диапазона памяти с помощью python/ctypes

Функция этого C-интерфейса нуждается в адресах памяти, поскольку она напрямую связана с памятью.

Прототип функции:

void function(ulong startAddress, ulong endAddress, ulong curAddress, nofPaddingElements) 

The StartAddress, endAddress и curAddress в основном память-адрес массива-оф-структур.

В Интернете (и stackoverflow ;-)) Я нашел ссылки, что если я хочу что-то делать с ctypes, так это то, что я использую.

Для началаAddress и curAddress можно следовать http://starship.python.net/crew/theller/ctypes/tutorial.html#arrays и http://starship.python.net/crew/theller/ctypes/tutorial.html#pointers, чтобы получить указатель на адрес первой записи и указатель на адрес текущей записи.

Но проблема с endAddress.
Это реальный конечный адрес области памяти, который должен быть выделен функцией.
Таким образом, для массива из целых 10 длинных это означало бы «адрес i [10]», если вы понимаете, что я имею в виду (пратически можно, конечно, использовать i [0] до i [9], но я имею в виду с i [10] адресом, где заканчивается 10-я запись/11-я запись начнет ==> конечный адрес массива).

Кто-нибудь знает, как я могу получить этот конечный адрес через python/ctypes?

(Рефакторинг C-код, чтобы он не нужен конечный адрес, это не вариант, он уже работает правильно в течение многих лет, это только не было UnitTest)

Oh кстати. в выпуске программного обеспечения, с которым я работаю сейчас, используется python 2.5 (в последующих версиях используется python 2.7, но в первую очередь необходимо его разработать)

+0

Если вы знаете размер и количество своих структур, вы должны иметь возможность рассчитать его относительно легко. 'ctypes.sizeof()' возвращает размер слова struct. – 101

+0

Я предполагаю, что 'ulong'' 'unsigned long', но' long' не всегда достаточно велик, чтобы удерживать указатель (например, он всегда 4 байта в Windows). Используйте 'intptr_t' для адресов в функции C. – eryksun

+0

@eryksun: Поскольку это стабильный рабочий код, мне не разрешено изменять интерфейс. Я работаю над Solaris (и будет перенесен в Linux), и в соответствии с Интернетом длина длинной составляет 8 байтов для версий, используемых компанией, для которой я программирую. Таким образом, он будет содержать указатель. Thanx в любом случае для вашего комментария – Nemelis

ответ

0

Претензии должны идти на eryksun (но не может установить правильную ответ "для комментария).