سؤال

كتبت برنامجا بسيطا 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 هو مجرد طلب تجاوز العازلة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top