سؤال

أحتاج إلى إنشاء حزمة تحتوي على رأس ومقطورة وحقل حمولة متغير الطول.لقد كنت أستخدم حتى الآن ناقلًا للحمولة لذلك تم إعداد البنية الخاصة بي على النحو التالي:

struct a_struct{
 hdr a_hdr;
 vector<unsigned int> a_vector;
 tr a_tr;
};

عندما أحاول الوصول إلى أعضاء المتجه أحصل على خطأ seg وحجم البنية بأكملها يعطيني 32 (بعد أن أضفت حوالي 100 عنصر إلى المتجه.

هذا هو نهج جيد؟ما هو أفضل؟

لقد وجدت هذا المنصبهيكل متغير الحجم C++لقد كان يستخدم مصفوفة شار، وأنا أستخدم ناقلًا بالرغم من ذلك.

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

المحلول

والحل في الجواب الآخر هو SO-C محددة، وتعتمد على خصائص المصفوفات ج - وحتى في ج، سوف sizeof () لا مساعدتك في العثور على "الحقيقي" حجم حجم البنية المتغيرة. في الأساس، فإنه من الغش، وانها نوع من الغش التي ليست ضرورية في C ++.

ما تقومون به على ما يرام. لتجنب أخطاء SEG، والوصول إلى ناقل كما تفعل مع أي ناقل آخر في C ++:

a_struct a;
for(int i = 0; i < 100; ++i) a.a_vector.push_back(i);
cout << a.a_vector[22] << endl; // Prints 22

نصائح أخرى

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

عادةً عندما يريد الأشخاص إنشاء بنية ذات حجم متغير، فإنهم يفعلون ذلك عن طريق إضافة مصفوفة كآخر عضو في البنية وتعيين طولها على 1.سيقومون بعد ذلك بتخصيص ذاكرة إضافية للبنية المطلوبة بالفعل بواسطة sizeof() من أجل "توسيع" البنية.يكون هذا دائمًا مصحوبًا بعضو إضافي في البنية يوضح بالتفصيل حجم المصفوفة الموسعة.

تم توثيق سبب استخدام 1 بدقة في مدونة ريموند

ورأيت هذا التنفيذ في boost..it يبدو حقا أنيق ... لديك متغير طول حمولة ....

<اقتباس فقرة>
class msg_hdr_t 
{
   public:
   std::size_t             len;     // Message length
   unsigned int            priority;// Message priority
   //!Returns the data buffer associated with this this message
   void * data(){ return this+1; }  //
};

وهذا قد يكون تماما الامم المتحدة ذات الصلة لهذا السؤال، ولكن أردت أن تقاسم المعلومات

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