السلام عليكم و رحمة الله و بركاته
سؤالي هو:
لماذا يحتاج المترجم إلى وضع الرمز /0 في نهاية كل مصفوفة حرفية !؟
السلام عليكم و رحمة الله و بركاته
سؤالي هو:
لماذا يحتاج المترجم إلى وضع الرمز /0 في نهاية كل مصفوفة حرفية !؟
اقتباسوضح سؤالك اكثر ماذا تقصد بالضبط .
عندما نقوم بالإعلان عن مصفوفة تحتوي (مثلا) على 5 خانات سيكون بإمكاننا استخدام 4 خانات فقط لأن الخانة الأخيرة ستحتوي على العنصر الخالي /0 !
و الهدف من وضع العنصر الخالي في آخر خانة من خانات المصفوفة (بحسب فهمي) هو إخبار المترجم بانتهاء المصفوفة !!
لكن .. ألا يمكن للمترجم أن يعرف أين انتهت المصفوفة بدون أن نخبره !؟ كما يفعل في المصفوفات العددية !
وشكرا مقدما.
اقتباسعندما نقوم بالإعلان عن مصفوفة تحتوي (مثلا) على 5 خانات سيكون بإمكاننا استخدام 4 خانات فقط لأن الخانة الأخيرة ستحتوي على العنصر الخالي /0 !و الهدف من وضع العنصر الخالي في آخر خانة من خانات المصفوفة (بحسب فهمي) هو إخبار المترجم بانتهاء المصفوفة !!
لكن .. ألا يمكن للمترجم أن يعرف أين انتهت المصفوفة بدون أن نخبره !؟ كما يفعل في المصفوفات العددية !
لغة الـ C و من بعدها Cpp تحتوى على انواع بسيطه مثل short و long و float و char. المصفوفات التى يتم انشائها من اى من الأنواع السابقه إن كانت داخل الـ stack فيمكنك معرفة حجمها - بدون تحويلها لمؤشر - و ذلك عن طريق احضار حجم المصفوفه بإستخدام sizeof و قسمته على حجم نوع المصفوفه.
بالنسبه للمصفوفه الحرفيه فهى ليست نص انما هى مجموعه من الحروف يمكن الوصول لأحد عناصرها بإستخدام موقعه داخل المصفوفه تماما كما تصل لموقع احد عناصر المصفوفات ذات الأنواع الأخرى.
و حيث اننا نحتاج لإستخدام النصوص داخل لغه لا تدعم النصوص فلابد من وضع مفاهيم و تعاريف حتى نستطيع تمييز النص، هذه القواعد تتلخص فى نقطتين:
1 - النص هو مصفوفه من النوع char - او wchar_t
2 - لابد و أن ينتهى النص بعلامه مميزه نستطيع منها معرفة ان هذا الموقع يمثل نهاية النص و هذا استخدام الـ Null Character او Null Terminator.
إذا كنت ستستخدم المصوصفه الحرفيه كنص فلابد و أن تنتهى بـ 0 و ذلك حت تستطيع دوال التعامل مع النصوص معرفة نهاية النص اما إن كنت ستتعامل مع المصفوفه الحرفيه كمصفوفة حروف فلابد منك ان تعلم عدد الحروف المكونه لها.
كما سبق و أوضحت انك يمكنك معرفة حجم المصفوفه الموجوده داخل الـ Stack فقط إذا كنت ستتعامل معها داخل الـ scope ألذى تم تعريفها فيه و لم تقم لتحويلها لمؤشر، ايضا المصفوفه التى تم تعريفها داخل الـ Heap يمكن معرفة حجمها داخل ويندوز كالتالى (لاحظ انه لابد من معرفة حجم نوع البيانات الذى تمثله المصفوفه، يعنى من الأخر void* مينفعش)
#include <windows.h>
#include <iostream>
using namespace std;
int getSize(int* arr)
{ return HeapSize(GetProcessHeap(), 0, arr) / sizeof(int); }
int main()
{
int* w = new int[100];
int size = getSize(w);
cout << size << endl;
system("pause");
}الداله getSize تعود لك بمساحة الداله التى تم انشائها داخل الـ heap.
لا تقم بتجربة المثال السابق داخل Visual Studio لإنه يستخدم Debug Heap خاص به داخل وضع الـ Debug و ايضا الـ Release، إذا كنت تريد تجربة المثال فقم بتجربته داخل مساحة الذاكره الخاصه به.
و الله ولى التوفيق
مدونتي: C++ Tips and Tricks