• 0
khaled_prg

المترجم Dev يفسد قانون من قوانين البرمجة .. ويتعدى الحدود !

سؤال

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

عندما تقرأ عنوان الموضوع قد تتفاجأ ! وقد يظن البعض أنني أُعطي للمسألة حجما أكبر من حجمها .. ولكن دعني أقول لك أن هذه مسألة حساسة جدا .. فإذا كان المترجم Dev يتعامل مع المصفوفات استاتيكية و كأنها ديناميكية ! فقد يقول البعض .. لا حاجة لنا في المصفوفات الديناميكية .. الأمر أصبح سهلا ...

عموما .. جئتكم اليوم بأسئلة في المؤشرات:

السؤال الأول:

جميعنا يعلم أنه يوجد نوعان من المصفوفات:

a-مصفوفات استاتيكية(حجمها ثابت):نقوم بتحديد حجمها قبل تنفيذ البرنامج.

b-مصفوفات ديناميكية(حجمها متغير):نقوم بتحديد حجمها أثناء تنفيذ البرنامج.

العجيب في الأمر !! أن المترجم Dev يتعامل مع المصفوفات استاتيكية و كأنها ديناميكية ! ,انظر المثال:

#include<iostream>
using namespace std;
int main()
{
int size;
cout<<"size=";
cin>>size;
int array[size];
for(int i=0;i<size;i++)
cout<<array[i]<<endl;
system("pause");
return 0;
}

عندما قمت بتطبيق هذا المثال .. لم ينبهني على وجود أي خطأ !! وقال لي بأن البرنامج شغال 100% !! بل وقمت بتطبيقه أيضا .. وإذا به يعمل وكأنني في مصفوفة ديناميكية !!!

بالمناسبة فقد قمت بتطبيق الكود في كل من Borland و Visual وقد أظهروا لي الخطأ.

أرجوا من الإخوة التوضيح.

السؤال الثاني:

قرأت في كتاب الإكسير ما يلي:

المتغيرات قيمها متغيرة وعناوينها ثابتة أما الإشارات فعناوينها ثابتة و قيمها ثابتة و لا يمكنك تغيير قيمها بل يجب عليك تهيئتها عند الإعلان عنها , أما المؤشرات فبإمكانك تغيير عنوانيها و قيمها.

مالفرق بين الإشارة و المؤشر ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

عزيزي,

لا تشغل بالك بهذا الأمر إن كنت تريد تعلم ++C, لأنه بالفعل لايوجد في ++C مصفوفات ديناميكية كالتي عرضتها:

int array[size];

السبب بكل بساطة, هو أن dev الذي تتكلم عنه ليس مترجم, و إنما واجهة تستخدم المترجم الشهير GCC و بالتحديد الـ Mingw port.

في C99 أي آخر معيار تم وضعه لـ C, يوجد هذا الشيء المسمى VLA أو Variable Length Arrays.

و GCC عندما يترجم فإنك تعطيه خيارات الترجمة, و افتراضياً فإنه يسمح بهذا الشيء في ++C. هل عرف السبب و زال العجب الآن؟

جميع المترجمات توفر لك التزاماً تاماً بقوانين اللغة, فمثلاً في GCC يمكنك ترجمة الملف بالطريقة التالي و ذلك لإعطائك أعلى مستوى من التحذيرات و مطابقة قوانين اللغة:

g++ -Wall -std=c++98 my_code.cpp -o my_code.exe

و لو قمت بترجمة البرنامج بهذه الخيارات فإنه سيظهر لك الخطأ بكل بساطة.

تحياتي...

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أولا أشكرك على الرد و على المساعدة

لكن أنا مبتدأ .. يعني يا ريت لو يكون الشرح بالتقصيل الممل ..

السبب بكل بساطة, هو أن dev الذي تتكلم عنه ليس مترجم, و إنما واجهة تستخدم المترجم الشهير

ما هو الـ GCC ??

جميع المترجمات توفر لك التزاماً تاماً بقوانين اللغة, فمثلاً في GCC يمكنك ترجمة الملف بالطريقة التالي و ذلك لإعطائك أعلى مستوى من التحذيرات و مطابقة قوانين اللغة:

g++ -Wall -std=c++98 my_code.cpp -o my_code.exe

و لو قمت بترجمة البرنامج بهذه الخيارات فإنه سيظهر لك الخطأ بكل بساطة.

تحياتي...

لم أفهم السطر الذي بالأعلى , أرجوا التوضيح

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مالمشكلة يا جملعة الخير ؟؟؟ لماذا لا تساعدوني ؟

أرجوا المساعدة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مالمشكلة يا جملعة الخير ؟؟؟ لماذا لا تساعدوني ؟

أرجوا المساعدة

GCC == Gnu C Compiler

أو

GNU Compiler Collection

و هو free و عادة ما يأتي مع نظام التشغيل linux ، و يمكنك عمل ال compilation لبرنامجك بعدة مستويات من "الصرامة".

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
GCC == Gnu C Compiler

أو

GNU Compiler Collection

و هو free و عادة ما يأتي مع نظام التشغيل linux ، و يمكنك عمل ال compilation لبرنامجك بعدة مستويات من "الصرامة".

أشكرك على الرد.. و أعتذر عن تأخر الرد ...

أخي الكريم .. كيف يمكنني أن أغير من مستوى الصرامة في الكوبايلر DEV

أشكرك مرة أخرى على الإفادة

في أمان الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

هل تصدقون أيها الناس أنني نسيت 90% من الإكسير والسي بلس بلس

آه يا لشوقي لعلوم الحاسب كله من برمجـة وذكاء صناعي ورسم وخوارزميات وأتوماتا ثيوري .. وكله وكله ... إلخ إلخ .....

عفواً أيها الصديق صاحب الموضوع ...........

إجابة على سؤالك

البرنامج الذي تستخدمه للتعامل مع السي بلس بلس يطبق جميع قواعدها القياسيـة التي اتفقت عليها منظمـة (أعتقد اسمها ANSI - حتى هذه نسيتها) بينما جميع المترجمات الأخرى مثل الفيجوال لا تطبقها ....

البرنامج سيعمل معك بشكل صحيح ؛ لكنه خطأ مصيبـة يظهر في وقت التشغيل وليس في وقت الترجمـة ... أي أثناء تنفيذ البرنامج وليس قبله ....

(المعلومات بالأعلى أرجو التأكد منها ؛ لأن هذا ما تفتق به مخي بعد أن حاولت أن أتذكر إجابة ما صحيحـة ..... )

الفرق بين الإشارات والمؤشرات:

المؤشرات نكتب قبل اسمها المحرف * بينما الإشارات نكتب قبلها & ..... والبقية معروفة من الكتاب

طبعاً هناك إستخدامات عظمى لهذه الإشارات والمؤشرات؛ أعتقد أنها حينما تريد تمرير متغير إلى دالة أو شيء من هذا القبيل ؛ ولها فوائد أيضاً في البرمجـة الشيئية OOP وخاصة في تعدد الأوجـة ....

أعتذر لك أيها الصديق وخاصة أنني غردت بعيداً

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم,,

أخي سلطان أين هذه الغيبة, هل تركت البرمجة :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .