الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف نحسب عدد بايتات مؤشر ما ؟

بدأه fouad2008 في 1 أغسطس 2009 · 5 رد · 785 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

السؤال كالاتي

نفرض انه لدينا

ptr : Pbyte

نقوم بحجز الذاكرة لهذا المؤشر

getmem(ptr,100) //alloc 100 byte

كيف نستطيع معرفة عدد البايتات لهذا المؤشر برمجيا و التي هي 100 في هذا المثال

#2

بالعملية العكسية طبعا

عزيزي :

لاتنسى ان تصلي على حبيبنا و شفيعنا يوم لا ينفع مال ولا بنون .

فاللهمّ صّل وسّلم على سيدي و شفيعي وحبيبي محمد عليك الف صلاة وازكى تسليم

*****

2_header.png

#3

SizeOf(ptr)

الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.

إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.

#4

التعليمة السابقة تعطيك حجم ptr وليس ما قمت حجزه

#5
اقتباس
التعليمة السابقة تعطيك حجم ptr وليس ما قمت حجزه

وهذا ما أراده السائل, هل لديك طريقة لمعرفة ما قمت بحجزه؟!

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#6

السلام عليكم ...

اقتباس
كيف نستطيع معرفة عدد البايتات لهذا المؤشر برمجيا و التي هي 100 في هذا المثال

أعتقد أن هذا غير ممكن\مفيد لك بأي حال من الأحوال. هذا على افتراض أن المؤشرات التي تتكلم عنها تشبه الموجودة في ++C/C و إلا لا فائدة من الكلام الذي سأقوله :)

أولاً, إذا أردت معرفة الحجم, فقم بتخزينه في متغير من تحكمك. فمثلاً بـ ++C و قم بتحويلها إلى المراد في Delphi.

size_t size = 10;
int* blockOfMemoryAddress = malloc(size); // 10 bytes!

و حتى في ++C/C لاتوجد طريقة لمعرفة الحجم الذي قمنا بحجزه لهذا المؤشر! لماذا ؟ لأنه من الممكن أن يشير إلى شيء آخر, و القيمة المعادة عبارة عن حجم المنطقة السابقة! و من الممكن في ++C/C أن يتحرك خطوة إلى الأمام أو إلى الخلف أو إلى أي مكان في الذاكرة!

و بالتالي, فإننا أذا أردنا أن نعرف الحجم, علينا أن نحفظه بنفسنا :)

الأمر الآخر, قد يأتي السؤال التالي, كيف تعرف free عن الحجم إذاً دون اخبارها!

free(blockOfMemoryAddress); // !!!

يسمح للـ Implementation أو لنقل المترجم, بأن يخزن الحجم في مكان ما يريده, و لكن لا يسمح له بعرضه,

لماذا أيضاً ؟

لأن الكود الذي يقوم بحجز الذاكرة من نظام التشغيل, قد يرى بأن نظام التشغيل لا يسمح بحجز 10 بايت, بل يسمح بقطع أكبر كحد أدنى لعملية الحجز كـ 4 kilobyte و هكذا.

هذا يرجع للبيئة التي يعمل فيها البرنامج, و بالتالي, تبقى معلومات الحجم الحقيقي الذي تم حجزه من نظام التشغيل, و معلومات حجم المنطقة التي ستستخدمها مفصولة عن بعضها لإعطاء Abstraction لعملية البرمجة,

و عدم الإعتماد على نظام تشغيل معين, أو حتى النسخ المتعددة من نظام التشغيل نفسه :)

تحياتي ...

مواضيع مشابهة