سؤال

في محاولة لالتفاف بعض التعليمات البرمجية غير المُدارة في ملف .dll المُدار، أحاول تحويل ملف Generic::List من نقاط البيانات إلى أ std::vector.إليك مقتطف مما أحاول القيام به:

namespace ManagedDLL
{
    public ref class CppClass
    {
        void ListToStdVec( const List<double>& input_list, std::vector<double>& output_vector )
        {
            // Copy the contents of the input list into the vector
            // ...
        }

        void ProcessData( List<double> sampleData )
        {
            std::vector<double> myVec;

            ListToStdVec( sampleData, myVec );

            // Now call the unmanaged code with the new vector
            // ...
        }
    }
}

تجميع هذا يعطيني:

خطأ C3699:'&' :لا يمكن استخدام هذا الاتجاه غير المباشر في النوع "const System::Collections::Generic::List"

ربما فاتني شيء أساسي هنا (أنا جديد نسبيًا على طريقة .net للقيام بالأشياء)، ولكن هذا يبدو وكأنه كود صالح إلى حد معقول بالنسبة لي..؟

[يحرر] لقد جربت اقتراحات آندي وداريو وقد نجحت، ولكن كيف يمكنني بعد ذلك الوصول إلى أعضاء قائمة الإدخال؟لقد جربت كل أنواع المجموعات المرجعية ويبدو أنه لا يوجد شيء يتم تجميعه:

void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector )
{
    int num_of_elements = input_list->Count;
}

void ListToStdVec( const List<double>^ input_list, std::vector<double>& output_vector )
{
    int num_of_elements = input_list.Count;
}

...كلاهما يعطيني:

خطأ C2662:'النظام::مجموعات::عام::قائمة::Count::get' :لا يمكن تحويل المؤشر "هذا" من "const System::Collections::Generic::List" إلى "System::Collections::Generic::List %"

... فكيف يمكنك الوصول إلى المرجع/المؤشر؟

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

المحلول

مثل List<T> هي فئة .NET مُدارة، ويتم تمريرها بواسطة GC-Handle مُدار يُشار إليه بواسطة ^ وليس بواسطة مرجع C++.

السابق:

void ListToVec(List<double>^ input_list, std::vector<double>& out)

لا تحتاج إلى إضافية const هنا.التدوين List<T>^% ينشئ مرجع تتبع (مشابهًا لمؤشرات C++) بدلاً من الاتصال حسب المرجع.فقط الوصول إلى الأعضاء عن طريق list->... و list[...].

نصائح أخرى

وفق هيرب سوتر, % هو تمرير الكائن المُدار حسب الحرف المرجعي.قم بتحويل الكود إلى ما يلي، ويجب أن يعمل:

void ListToStdVec( const List<double>% input_list, std::vector<double>& output_vector
{
    // Copy the contents of the input list into the vector
    // ...
}

يحرر:اعتقد ان const يسبب المشاكل، على الرغم من أنني لست متأكدا من السبب.إذا قمت بتغيير List حجة أن لا يكون const, ، فسيتم تجميع الوظيفة الأولى إذا كنت تستخدم -> المشغل، بينما سيتم تجميع الوظيفة الثانية إذا كنت تستخدم . المشغل (لست متأكدًا من سبب وجود هذا الاختلاف - فهو ليس له معنى كبير).

ومع ذلك، إذا كان كل ما تريد القيام به هو نسخ العناصر الموجودة في الملف List إلى vector, ، فأنت تريد حقًا استخدامه ^.فكر في ذلك على أنه يحتوي على إشارة إلى الكائن المُدار.اعتقد انه % سيتم استخدامه إذا كنت تريد تمرير المرجع "حسب المرجع" (أي.إعادة تعيين input_list إلى شيء آخر في الداخل ListToStdVec(), ، واطلب من المتصل رؤية نتيجة تلك المهمة.ومع ذلك، نظرًا لاستخدامك . المشغل للوصول إلى الأعضاء عند الاستخدام %, ، هذا يخبرني أنني قد لا أفهم الغرض من ذلك على الإطلاق.

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