سؤال

ولدي مجموعة 3rd الطرف الملفات .H مع ملفات .LIB التي تذهب معهم. أنا التفاف تلك الملفات الأصلية C ++ مع C ++ / CLI المجمع وإجراء مكالمات النهائية من C #. لدي مشكلة عندما استدعاء الأساليب التي تتوقع إشارة إلى أن تنتقل في حيث لم يتم الحصول على تغيير قيمة في بلدي المجمع، إلا أن تغييره صراحة.

وبلدي C ++ / CLI كود المجمع تبدو حاليا مثل هذا:

bool get_testInt16(int16% testInt16)
{
   int16* t = static_cast<int16*>(GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer());
   bool b = m_NativeCMTY_TestData->get_testInt16(*t);
   testInt16 = *t;
   return b;
};

والأصلي كود المقابلة C ++ يشبه:

bool get_testInt16(int16 &testInt16);

والرقم الأول هو يجب ان يكون هناك طريقة أفضل، ولكن ربما لا؟ اسمحوا أن أقول وأنا على أمل أن هناك طريقة أفضل!

هل كانت مفيدة؟

المحلول

وخيار سيكون القيام به:

bool get_testInt16(int16% testInt16)
{
   int16 t = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(t);
   testInt16 = t;
   return b;
};

وهكذا يمكنك ببساطة إنشاء متغير الأصلي المحلي وتجنب يلقي ضخمة و. NET مؤشر الاشياء.

نصائح أخرى

ولأي سبب كنت لا تستخدم مؤشرات بدلا من GCHandle::ToIntPtr(GCHandle::Alloc(testInt16)).ToPointer() تعلق؟

وتعلق أيضا قيمة المشار مثل هذا بعد فوات الأوان.

إذا كانت الإشارة إلى قيمة كومة هو لزوم لها، إذا كان هو إشارة إلى حقل المثال ثم رمز الدعوة يجب أن دبوس حقا الكائن (رغم أن هذا هو تسرب الفوضى من semntics غير المدارة إلى التعليمات البرمجية المدارة على الأقل يجعل سلوك أسلوب واضح.

ومنذ المعلمة المرجع صغيرة جدا فمن المنطقي لتجنب فقط كل تعلق تماما وإنشاء واحدة مؤقتة على المكدس، تمرير ذلك من خلال وظيفة غير المدارة والكتابة بعد ذلك العودة إلى الأصل.

bool get_testInt16(int16% testInt16)
{
   int16 temp = testInt16;
   bool b = m_NativeCMTY_TestData->get_testInt16(temp);
   testInt16 = temp;
   return b;
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top