استخدمات STRUCT حجمها غير معرفة

السلام عليكم ورحمة الله تعالى وبركته

أعرف أن العنوان غير واضح, لاكن ما أريد قوله هو :

أريد انشاء نوع من البيانات خاص بي لأستخدمه في الكود الخاص ببرنامجي

مثال

struct MyStruct

{

int a;
int b[3][4];

};

هدا النوع حجمه معروف مسبقا

المشكلة هي أن النوع الدي أريد انشاءه أنا

يحتوي على جدول (array) لا أعرف حجمه في البداية

قد يقول لي البعض أن أستخدم مؤشر ثم أقوم بحجز الداكرة على حسب ما أريد

لاكن أنا هدا النوع سأستخدم منه العديد من المتغيرات يعني يجب علي في كل مرة علي حجز الداكرة وهدا سيأخد وقت مقارنة مع ما سيقوم به البرنامج

  • في برنامجي يحتوي على العديد من الأشياء (objet) ومن attributes الخاصة بها هدا النوع من المتغيرات

ما الحل في رأيكم ؟

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

أنصحك بستخدام Dynamic Array كما ذكر الاخوة مثل vector او استخدام Linked list، فهمتك عندما قلت أنك تريد حجز مكان في الذاكرة قبل دخول البيانات، حيث لاتتم عمليتين معاً (الحجز، والأدخال) فيما تعتقده يأثر على سرعة العمل.

ولكن لو افترضنا ذلك صحيحاً الحجز المسبق ليس ألا تأخير مقدّم، عملية الحجز سوف تتم في كلا الحالات والوقت الذي يستغرقه الحجز سيتم سواء عند التعريف أو عند الملئ. فا الأنسب هو الحجز (عند الاستخدام) وهو أيضاً اقل استهلاكاً للذاكرة وأكثر سرعة. عندما تحجز مكان في الذاكرة يكون مؤشر الذاكرة عند (المكان نفسه الذي قمت للتو بحجزة) وهنا تكون حالتان (أما أن تملاء المكان) فلا يتحرك المؤشر أو أن تجعله محجوز ويتحرك المؤشر لاداء امور اخرى ثم يعود لملء المكان. لذلك الحجز، والملء في نفس الآوان أنسب من الحجز المسبق والملء اللاحق. ولهذا وجدت حلول كـ Linked list و Dynamic array.

أتمنى أن تفهمني من هدا المثال:

struct mystruct{

int a;

int table[4][6];

};

struct mystruct *mydata;

mydata=malloc(sizeof(mystruct*));

هدا جيد

لأنني حددت حجم الجدول في struct

int table[4][6];


الآن لن نحدد حجم الجدول

struct mystruct{

int a;

int *table;

};

struct mystruct *mydata;

mydata=malloc(sizeof(mystruct*));

الآن سأضطر لحجز حجم الجدول الموجود تحت mydata كدالك

وهدا مالا أريده

لأنني ادا استخدمت linked list أو dynamic array

سأضطر لعملية حجز الجدول بعد كل عملية اضافة حلقة في linked list أو زيادة خانة في dynamic array


مشكلتي هي أنني لا أعرف حجم الجدول، المستخدم من سيدخله ، ثم الحجم سيبقى ثابت طيلة مدة تشغيل البرنامج.

يعني أريد أن أبحت عن طريقة لكي لا أضطر أن اقوم بعملية حجز للجدول في كل مرة أستخدم فيها متغير جديد

int ** b ;

ثم استعمل ال malloc

أنا سأستعلها بهدا الشكل

struct MyStruct

{

int a;

int **b;

};

ثم

struct MyStruct fortest[1000];

يجب على أن أستخدم malloc ألف مرة

وهدا ما لا أريده

أبحت عن طريقة أقوم بحجز الداكرة فقط المرة الأولى ومن ثم يصبح حجم struct ثابت وأستخدمه بشكل عادي

ما لغة التي تستخدم؟

C أم ++C

الإثنان معا

في ++C يمكنك استخدام صنف std::vector وهو مصفوفة متغيرة Dynamic array

شرحه في كتاب اﻹكسير صفحة 247

-

في C ربما يفيدك هذا

-

لأي أسئلة أو نقاش يخصان اللغتين أكتبهما في مجتمع ++C

المرجو أن تقرأ هدا الرد جيدا

على إعتبار أن C99 متاح لك يمكنك فعل الأتي

struct pascal_string {
unsigned short length;
char bytes[];
};

حجز الذاكرة يتم هكذا

   struct pascal_string *mystr = malloc(sizeof *mystr + byte_count);

في حالة أنك لا تستعمل C99 يمكنك عمل array ذو عنصر وحيد ومراعاته عند تحديد الحجم ب-malloc.

هذا الموضوع إسمه flexible array member لو أردت البحث عنه. الفرق بينه و بين المؤشر إنه محاذي لل struct مما يسهل نسخه.

لم أستوعب جيدا

ممكن شرح بسيط

ما أريده هو

إنشاء struct تحتوي على جدول حجمه غير معرّف, لكن بعد تنفيد الكود, المستخدِم سيدخِل عدد خانات الجدول.

ومن ثم أريد استخدام struct بشكل عادي,يعني أن أقوم بالإعلان عن متغيرات من دلك النوع دون أن أقوم بعملية الحجز في كل مرة.

هل كل جدول حجمه مختلف أم أنه يتم إدخل احداثيات ما مرة وحدة ويتم استخدامها طيلة عمل البرنامج لعدة كائنات؟

ما الغرض من وراء ذلك؟

نعم هدا ما أريده

سيتم ادخال الاحداتيات فقط المرة الأولى

لدي العديد من الكائنات من نوع عامل وكل عامل يجب أن يملك جدول خاص به

البرنامج سيستخدم من طرف بعض المؤسسات وكل مؤسسة هي من تحدد حجم الجدول

على ما أضن أن الموضوع غير مفهوم, آسف

لقد غيرت الطلب إلى

تغيير حجم struct بعد الإعلان عنها