Я создаю очень простой (охват) 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, но в первую очередь необходимо его разработать)
Если вы знаете размер и количество своих структур, вы должны иметь возможность рассчитать его относительно легко. 'ctypes.sizeof()' возвращает размер слова struct. – 101
Я предполагаю, что 'ulong'' 'unsigned long', но' long' не всегда достаточно велик, чтобы удерживать указатель (например, он всегда 4 байта в Windows). Используйте 'intptr_t' для адресов в функции C. – eryksun
@eryksun: Поскольку это стабильный рабочий код, мне не разрешено изменять интерфейс. Я работаю над Solaris (и будет перенесен в Linux), и в соответствии с Интернетом длина длинной составляет 8 байтов для версий, используемых компанией, для которой я программирую. Таким образом, он будет содержать указатель. Thanx в любом случае для вашего комментария – Nemelis