السلام عليكــم ورحمـة الله وبركاتــه ،،
السؤال كالاتي
نفرض انه لدينا
ptr : Pbyte
نقوم بحجز الذاكرة لهذا المؤشر
getmem(ptr,100) //alloc 100 byte
كيف نستطيع معرفة عدد البايتات لهذا المؤشر برمجيا و التي هي 100 في هذا المثال
السلام عليكــم ورحمـة الله وبركاتــه ،،
السؤال كالاتي
نفرض انه لدينا
ptr : Pbyte
نقوم بحجز الذاكرة لهذا المؤشر
getmem(ptr,100) //alloc 100 byte
كيف نستطيع معرفة عدد البايتات لهذا المؤشر برمجيا و التي هي 100 في هذا المثال
بالعملية العكسية طبعا
SizeOf(ptr)
الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.
إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.
التعليمة السابقة تعطيك حجم ptr وليس ما قمت حجزه
اقتباسالتعليمة السابقة تعطيك حجم ptr وليس ما قمت حجزه
وهذا ما أراده السائل, هل لديك طريقة لمعرفة ما قمت بحجزه؟!
رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.
لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"
السلام عليكم ...
اقتباسكيف نستطيع معرفة عدد البايتات لهذا المؤشر برمجيا و التي هي 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 لعملية البرمجة,
و عدم الإعتماد على نظام تشغيل معين, أو حتى النسخ المتعددة من نظام التشغيل نفسه :)
تحياتي ...