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

احتاج شرح بعض الاكواد ( نوعا ما متقدمة )

بدأه soufianosse في 17 يناير 2010 · 7 رد · 1,259 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قرأت سورس احد البرامج ولم افهم بعض الامور

union yyalloc
{
  short yyss;
  YYSTYPE yyvs;
# if YYLSP_NEEDED
  YYLTYPE yyls;
# endif
};

unio ؟ short ؟

هل هي متل structure او الـclass

تم هدا التعريف للمصفوفة ؟ short ؟

static yyconst short int yy_accept[127] =
    {   0,
        0,    0,   50,   49,   48,   30,   24,   49,   32,   33,
       36,   34,   29,   35,   27,   37,   45,   28,   41,   39,
       42,   43,   43,   43,   43,   43,   43,   43,   43,   43,
       43,   43,   25,   26,   38,   21,   48,    0,    0,   45,
       31,   40,   43,   43,   43,   43,   43,   43,   43,   43,
       43,   43,   43,   43,   43,   43,   43,   43,   43,   10,
       43,    0,   46,   44,   43,   43,   43,   43,   19,   43,
       43,   43,   43,    3,   43,   13,   43,   43,   23,   43,
       43,   18,   20,   47,   43,   43,   43,   43,   43,   43,
       43,   43,   43,   43,    8,   17,    5,   43,   43,   43,

       11,   43,   43,    2,    9,   43,   15,   22,   43,   12,
       43,   43,   43,    7,    4,   43,   14,   43,   43,   16,
       43,   43,   43,    6,    1,    0
    } ;

هدا الكود ايضا ؟ ما هدا النوع من البرمجة ؟ لمادا استعمال # تقريبا ربع البرنامج مكتوب بهده العلامة

# define YYSTACK_RELOCATE(Stack)					\
    do									\
      {									\
	YYSIZE_T yynewbytes;						\
	YYCOPY (&yyptr->Stack, Stack, yysize);				\
	Stack = &yyptr->Stack;						\
	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;	\
	yyptr += yynewbytes / sizeof (*yyptr);				\
      }									\
    while (0)

#endif

تم تعديل هذه المشاركة بواسطة soufianosse في 17 يناير 2010 في 16:04

#2

الذي أعرفه أن short عكس long أي أن المتغير سيكون أصغر من int .

وبالنسبة ل define فأظن والله أعلم أن من وظيفتها التأكد أن هذا الكود لم يكرر في ملف أخر في حالة أنه كرر فسيتجاهله .

تم تعديل هذه المشاركة بواسطة أباسليمان في 17 يناير 2010 في 18:20

#3

union هي تعمل نفس عمل struct ولكن أول اانظر للمثالين أدناه

struct MyStruct
{
  int i;
  long a;
  double d;

};

Union Myunion
{
  int i;
  long a;
  double d;

};

ستلاحظ في المثالين أعلاه أن كلا من structure و Union يحملان نفس العناصر . وأظن سؤالك الأن بما انه نفس العناصر ماهو الفرق بينهما وماهي فائدة وجود دالتين تحملان نفس المواصفات !!

الأن سوف نشرح الفرق بينهما .

سوف نتكلم عن الذاكرة أو Memory التي يحتاجها كل العناصر . سنجد أن

العنصر الأول من نوع int يحتاج الى 2 بايت

العنصر الثاني من نوع long يحتاج الى 4 بايت

العنصر الثالث من نوع Double يحتاج الى 8 بايت .

إذا اجمالي الذاكرة المستهلكة هي : 10 بايت لانشاء المتغيرات السابقة .

إلى هنا كل شي على مايرام ولكننا لم نجيب على الفرق بين الدالتين .

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

أما union فهي تبحث عن العنصر الأكبر ، والذي هو هنا عبارة عن double d والذي سوف يحتاج لمساحة 8 بايت من الذاكرة وبالتالي سوف تقوم الدالة بحجز مساحة واحدة مشتركة عبارة عن 8 بايت فقط .

ومن خلال هذه نستطيع القول بأن union تحتل مساحة أقل من الذاكرة .

ولكن يتبادر للذهن سؤال آخر . أذا قمت بإدخال قيمة i و a و d فهذا يعني اننا نحتاج الى 10 بايت فكيف نستطيع تخزين 10 بايت في مساحة 8 بايت فقط ؟؟

الجواب .

union تعمل على one input one output أي أن أدخال واحد واخراج واحد فقط .

كيف ذلك ؟

أي عندما نقوم بادخال قيمة i وبعدها قيمة a فإن الدالة سوف تمسح القيمة السابقة وتسبدلها بالقيمة الجديده في نفس المساحة المحجوزة من الذاكرة .

أي انك لكي تتعامل مع union فيجب ان تقوم بادخال فيمة المتغيير والعمل عليها واخراجها على الشاشة قبل ان تقوم بإدخال قيمة المتغير الثاني من عناصر union .

مثال

cin>>i;
i=i*100;
cout<<i;

cin>>a;

a=a+100;
cout<<a;

وهكذا

بالنسبة DataType short فهي في الحقيقة int

عندما نحجز متغير من نوع int فإننا نستخدم الكود التالي

int a;

ولكننا في الحقيقة نقول

short int a;

أي انها عبارة عن DataType من نوع int

Define هي في الحقيقة ثابت constant أي ان القيمة بمجرد تعيينها في اول مرة لايمكن تغييرها اطلاقا

هذه الدالة سابقة في c وحالياً في السي ++ تم استبدالها بالدالة const .

أتمنى ان أكون اجبت على تساؤلاتك

تحياتي

تم تعديل هذه المشاركة بواسطة omani في 18 يناير 2010 في 07:06

2

OMANI FOR EVER

-------------------------------------------------

post-12787-12780191801974.jpg

-------------------------------------------------

#4

أباسليمان : شكرا على مشراكتنا بمعلوماتك

omani : بارك الله فيك اخي شرحك واضح

بالنسبة لـDefine فاعرفها لكن ما اقصد اني وجدت العديد من الكلمات تسبقها نفس العلامة

وحسب ما اعرف ان هده الاوامر تسمى Preprosessor

في البرنامج موجود #if #else #line ... ما الفرق متلا بين if العادية وهده ؟ :huh:

ومادا تعني بسابقة ؟ هل يعني هدا ان هده الاوامر تترجم قبل ترجمة الكود الاصلي ؟ ومتى يتم استعمالها ؟ :blush:

#5

اتدكر اني وجدت في المنتدى كود يشبه هدا

#include <stdio.h>

#define return cout<< "hello world" ;

int main()

{

return 0;

}

الكود يطبع الجملة HelloWorld لكن كيف ؟

لافهم اكتر كيف تعمل هده الاوامر اضن ان علي ان افهم كيف يعمل هدا الكود

بمعنى كيف يتم استبدال كلمة return بامر الطباعة رغم انها كلمة محجوزة ؟ :wacko:

#6

فهتك أخي الكريم هذا مايسمى بالماكرو حيث يستبدل في مثالك هذا اي كلمة return إلى cout<<Hello world

انضر إلى هذا الرابط وتحديدا مشاركة رقم #5 .

/index.php?showtopic=2702

#7

شكرا لك على الرابط

استفدت منه بعض الامور لكن لم اصل الى ما ابحت عنه بعد

لا ابحت عن شرح الماكرو انما هده الاوامر ككل التي تسبقها علامة # مادا تعني ؟ ومتى نستعملها ؟ #if #else #line ......

تم تعديل هذه المشاركة بواسطة soufianosse في 19 يناير 2010 في 04:32

#8

ممكن تنظر لهذا الشرح في موقع IBM

http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc09pifndef.htm

وعلى فكره الموقع ده فيه مرجع جامد دور فيه على معظم اللى مش فاهمه

ولو مش واضح (بسبب اللغه او اي سبب )

اسال

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