الشبكة العربية لمطوري الألعاب

موهوب  راسم حسان مشاركة 1

مرحبا شباب...
أنا بلشت اتعلم ++C مشان طور معلوماتي وطريقة تفكيري..
اللي بدي ياه هو انو عندي مجموعة أسئلة كبيرة، وحاسس حالي وحيد بالموضوع فمافي حدا حولي بيعرف بالموضوع...
عم بقترح إذا في جماعة يشاركوني اهتمامي هون ممكن نتعلم سوى بهالمنتدى إذا مافي مشاكل عند المشرفين...

في حدا معي؟

راسم حسان

خبير مدير همام البهنسي مشاركة 2

أنا... أنا... لح تلاقيني طالب نجيب قاعد بالصف الأول معك...
من فترة جيدة بدأت اتعلم C ونفذت كم مشروع صغير بس لسا ما عندي المرونة الكافية لتنفيذ مشروع بيحترم حاله لحالي☺
وما عليك من المشرفين تبع البرمجة أنا عندي واسطة ثقيلة:)

موهوب  راسم حسان مشاركة 3

ممتاز! وين وصلت تقريباً بالـ C؟ ولا صرت بالـ ++C ؟
أنا يالله فايت بأنواع المتغيرات وطريقة سير البرنامج (main وأمثلة بسيطة)...

بس خيي عم يرعبوني العالم عن موضوع اسمه البوينترات. قال هي أعقد شي بالـ C
صحيح الحكي؟ وشو وظيفتها أصلاً؟ أنا لسا ما وصلتلها...

راسم حسان

خبير  سعيد بسيوني مشاركة 4

إيه الكلام ده ياعم! سيبولنا حاجة نفهم فيها لوحدينا يعني...

كلام جد... أنا جاهز للمساعدة تماماً. انت وهمام...
بصراحة أنا معلوماتي مش قوية جدا برضو، بس يعني أكيد عارف كيف اعمل متغيرات☺

بالنسبة لموضوع البوينترات. ده بالفعل مش سهل، خاصة لواحد خش للموضوع من جديد...
بس أهو كلنا بنتعلم يا خويا...
ح اشرحهالك بس لتتقدم شوية كمان

خبير مدير همام البهنسي هذه المشاركة مميزة مشاركة 5

أنا تقريباً خالص من الأساسيات النظرية بالـ C بس بيهمني راجعها مرة ثانية وخاصة من خلال تمارين عملية.
بالنسبة لموضوع البوينترات ما بدي خبي عليك أنو بالبداية كان مربك شوي لأنه ما كان عندي المرونة الكافية للتعامل مع عناوين الذاكرة ومحتوياتها بهذا الشكل. بس بتوقع إذا برجع بعمل كم تمرين صغير برجع بتذكرهم بشكل جيد.
على كل أنا جهزت دفتري ومحاية وقلم☺ وبدي شي تمرين أو وظيفة نفذها...
وشكراً مسبقاً لك أخي سعيد ولكل واحد ح يساعدنا بهذا الموضوع...

خبير  Mohammad Khashashneh مشاركة 6

Ok, I want to help so I'll be your teacher for the first lesson, and since our students are already familiaer with C , I will address the basics of pointers:

Lesson 1: Variables and Pointers

- Defining a variable in C:
To define a variable (a) of type Integer, you say like this:
int a ;  // Define a variable called a

the compiler will allocate memory of size 32-bits (4Bytes) for the variable and sets the label (a) to it:
              |                             |
              |     Main Memory             |
           a  |    allocated memory         |  address 1000
              |                             |

- Assign values to variables:
To assign a value to (a) we say like this:

a = 10 ; // Store the value 10 in a.

The compiler will go to the memory location that has a label equals to (a) and stores the value 10 in it:
              |                             |
              |     Main Memory             |
            a |             10              |  address 1000
              |                             |

You can also assign values stored in other variables into (a) .
first we define a new variable (b) and assign the value 20 to it like this:

int b = 20 ; // Define a variable b and assign 20 to it.

The compiler will allocate memory for the new variable (b) and store 20 into it:
              |                             |
              |     Main Memory             |
            a |             10              |  address 1000
            b |             20              |  address 1004 (1000 + 4bytes)
              |                             |

Then we copy the value stored in (b) into (a). This will remove the old value stored in (a) which is 10 and replace it with the value stored in (b) like this:

a = b ; // This will copy the value b and store it into a

the compiler will copy (b)'s value which is 20 and store it into (a):
              |                             |
              |     Main Memory             |
            a |             20              |  address 1000
            b |             20              |  address 1004 (1000 + 4 bytes)
              |                             |

- Defining a pointer
To define a pointer of type integer we say like this:
int * p ;  // similer to variables but with a * added before the pointer name.

this will allocate memory to the new pointer the same as any regular variable:
              |                             |
              |     Main Memory             |
            a |             20              |  address 1000
            b |             20              |  address 1004
            p |new allocated mem.           |  address  1008 (1004 + 4 bytes)
              |                             |

A pointer like any other variable, can be assigned with values. But not any type of constant values, you can only assign memory addresses to it like other variables addresses.
p = 10 ; //This is an ERROR, you cannot assign constant values to pointers!

p = &a ;// Assign the address (&) of variable a to pointer p
            // Notice that we use the & operator to reffer to the address of a.

This will store the address of (a) which is 1000 into the pointer (p) like this:
              |                             |
              |     Main Memory             |
            a |             20              |  address 1000
            b |             20              |  address 1004
            p |            1000             |  address  1008 (1004 + 4 bytes)
              |                             |

with this, we say that the pointer (p) points to the variable (a) which means that the address of (a) is stored into (p).

- Using pointers to assign values to other variables
With pointers we can manipulate other variables values because we know their addresses. You can do that by using the * operator in front of the pointer name. The compiler will check the address stored in the pointer and go to it to change its value.

*p = 30 ; // This will store 30 into (a) because the address of (a) is stored in (p)
               // this is the same as  a = 30 ;

The compiler will see the address 1000 stored in (p), then go to that address which has the label (a) and change its value to 30.
              |                             |
              |     Main Memory             |
            a |             30              |  address 1000
            b |             20              |  address 1004
            p |            1000             |  address  1008 (1004 + 4 bytes)
              |                             |

Notes:
- this is only a basic explanation to variables and pointers in the C language.
- Pointers have many forms and usage , They can point to a block of memory and not only a variable.
- pointers are very powerfull and Destructive in the same time! simply because they are used to access memory addresses and modify their values, and it is easy to overwrite addresses that does not belong to you which will result in to corrupting other programs (or your own) data which may result in crashing the program owning that data.

I hope you understood this lesson, please feel free to ask any questions.

من سار على الدرب وصل, من جد وجد...
بس عتبك على اللي بيسمع

خبير مدير همام البهنسي مشاركة 7

شكراً جزيلاً يا أخي محمد... للصدق والأمانة قرأت الكثير من المراجع والكتب التي تشرح المفاهيم البسيطة للغة الـ C ولكني لم أرى بوضوح و بساطة شرحك☺ وخاصة بالنسبة لمفهوم الـ pointers... جزاك الله كل خير...

وبانتظار الدرس الثاني بفارغ الصبر أو بتمارين على الدرس الأول☺.

شكراً مرة أخرى!!

موهوب  راسم حسان مشاركة 8

يسلمو ع الشرح أخ محمد! كتير مفيد...
أنا عملت تجربة ع الكلام، وهي النتيجة:

int var1 = 15;
int var2 = 25;

int * p = &var1;
*p = 45;
P = &var2;
*p = 35;

printf(“%d”,var1);
putc(‘\n’);
printf(“%d”,var2);
putc(‘\n’);
printf(“%d”,p);

/*
The result was:
45
25
2335120
*/


طيب ليش الـ compiler اختار العنوان 2335120 ؟ مش المفروض ياخد العنوان 1004 ؟
ع حسب استيعابي، ممكن باستخدام الـ pointer تتحكم بأي عدد من المتغيرات من متغير واحد. بس مش كأنها طريقة ملتفة للجواب عن وين دانيك؟

راسم حسان

خبير  سعيد بسيوني مشاركة 9

عاوز أقدم بعض التوضيحات هنا...
ذكر محمد موضوع مهم جداً وهو انك لما تعلن عن متغير من نوع int فالمترجم بيحجز 4 بايت في الذاكرة. الموضوع ده هو الأساس في التفريق بين أنواع المتغيرات التانية. مثلاً:
int i; // Allocates 4 bytes (or 32-bits)
short s; // Allocates 2 bytes (or 16-bits)
char c; // Allocates 1 byte (or 8 bits)

طيب. دلوقتي إيه يعني الفرق بحجم الذاكرة المحجوزة؟ يعني انو المتغيرات اللي تاخد حجم أكبر في الذاكرة ممكن تحفظ أرقام وقيم ضمن نطاق أكبر. مثلاً، لو أعلنت عن متغير من نوع char، فممكن تحفظ فيه القيم ضمن النطاق [-127,127] فقط!
طيب أنا عاوز أحفظ الرقم 2000؟ في الحالة دي بروح واستخدم متغير بحجم أكبر. مثلاً الـ short ممكن يحفظ قيم في النطاق [-32767,32767] وهكذا.
في حالة المتغير من نوع int فالرقم المتاح كبييير قوي. يجي حاجة زي 2 بليون موجب و 2 بليون سالب...
طيب... أنا عندي رقم أكبر من 2 بليون! مثلاً 3 بليون! إيه الحل؟
فيه عبارة إضافية في لغة C ممكن تستخدمها عشان تزيد النطاق الممكن تعبر عنه المتغيرات بتاعك. هي عبارة unsigned...
وقت تضيف عبارة unsigned قبل نوع المتغير، فإنت بتقول للمترجم الآتي:
يا اسطه! أنا مش عاوز احفظ قيم سالبة في هزا المتغير! ضيفلي النطاق السالب مع النطاق الموجب.
فمثلاً:
unsigned char uc; // Allocates 1 byte (or 8 bits)

هزا المتغير ممكن الآن يحمل قيم ضمن النطاق [0,255]!!
ما الزي حدث؟ الزي حدث هو ان المترجم خد القيم من -127 إلى -1 ولغاها، وبالمقابل حجز نفس مساحتها للتعبير عن نطاق أوسع ضمن نفس مساحة الذاكرة...

تمرين، المتغيرات الآتية، إيه نطاقها؟
unsigned short us;
unsigned int ui;
unsigned long ul;

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

محترف مشرف عبد اللطيف حاجي علي مشاركة 10

التعليق على مشاركة سعيد بسيوني في Mar 10, 2006 10:31 :

> عاوز أقدم بعض التوضيحات هنا...
> ذكر محمد موضوع مهم جداً
> وهو انك لما تعلن عن متغير من نوع int فالمترجم بيحجز
> 4 بايت في الذاكرة.
طبعاً أنت تتكلم عن حالة نظم الـ 32-bit لأن الموضوع سيختلف مع الـ 16-bit و الـ 64-bit

> ضمن النطاق [-127,127] فقط!
فقط للذكر المدى هو [-127,128] لأن الكومبيوتر يستخدم الـ 2s complement وليس الـ signed representation

> طيب... أنا عندي
> رقم أكبر من 2 بليون! مثلاً 3 بليون! إيه الحل؟
> فيه عبارة
> إضافية في لغة C ممكن تستخدمها عشان تزيد النطاق الممكن
> تعبر عنه المتغيرات بتاعك. هي عبارة unsigned...
في الحقيقة أنت لا تزيد النطاق أنت فقط تغير بدايته و نهايته... ففي الحالتين أنت تستطيع فقط الحصول على 256 رقم من متغير char مثلاً

> ما الزي حدث؟ الزي حدث هو ان المترجم خد القيم من -127 إلى -1 ولغاها،
> وبالمقابل حجز نفس مساحتها للتعبير عن نطاق أوسع ضمن نفس مساحة الذاكرة...
في الحقيقة لم يحصل أي إلغاء أو حجز فقط تغيير لطريقة تفسير الـ bits في المتغير...

عبد اللطيف حاجي علي
مبرمج
In|Framez