بيثون ctypes: تهيئة c_char_p ()
-
18-09-2019 - |
سؤال
كتبت برنامجا بسيطا C ++ لتوضيح مشكلتي:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
أنا تجميع هذا في ذلك. من بيثون أدعو:
from ctypes import *
libso = CDLL("Debug/libctypesTest.so")
func = libso.test
func.res_type = c_int
for i in xrange(5):
charP = c_char_p('bye')
func(i,charP)
print charP.value
عندما أقوم بتشغيل هذا، فإن الإخراج هو:
bye
hi
hi
hi
hi
توقعت:
bye
hi
bye
bye
bye
ماذا ينقصني؟
شكرا.
المحلول
السلسلة التي قمت بتهيئة الأحرف "bye"
, ، وعندما تواصل أخذها وتعيينها charP
, ، لا يحصل على إعادة تهيئة بعد المرة الأولى.
اتبع المشورة هنا:
ومع ذلك، يجب أن تكون حذرا، مع ذلك، عدم اجتيازها إلى وظائف تتوقع المؤشرات على الذاكرة القابلة للتغيير. إذا كنت بحاجة إلى كتل الذاكرة القابلة للتغيير، فستكون CTTYPES وظيفة Create_String_Buffer التي تنشئ هذه بطرق مختلفة.
"مؤشر إلى الذاكرة القابلة للتغيير" هو بالضبط ما تتوقعه وظيفة C، وبالتالي يجب عليك استخدام create_string_buffer
وظيفة لإنشاء هذا المخزن المؤقت، كما يفسر المستندات.
نصائح أخرى
أنا أظن أن بيثون هو إعادة استخدام نفس المخزن المؤقت لجميع الممرات الخمسة. بمجرد ضبطها على "مرحبا"، فأنت لم تقم بعملها أبدا "وداعا" يمكنك القيام بشيء مثل هذا:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
} else {
strcpy(var, "bye");
}
return 1;
}
لكن كن حريص، strcpy
هو مجرد طلب تجاوز العازلة