• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

آموزش C++ سي پلاس پلاس از پايه

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از saalek :
در نامگذاري متغيرهاي كلاس بعضي برنامه نوس ها كلمات itsAge و itsWeight را بكار مي برند. اين جوري معلوم ميشه كه كدام متغيرها از اعضاي كلاس هستند و كدام ها نيستند. يعني آنهايي كه its دارند از اعضاي كلاس هستند.

در نام گذاري اسم خود كلاس ، بعضي حرف اول را به نشانه اينكه اسم كلاس است بزرگ مي نويسند و بعضي كل كلمه را بزرگ مي نويسند. من خودم از اسمي كه تمام حروفش بزرگ باشه مي ترسم چون كنستانتهاي header را كه خيلي زياد است را ديده ام كه همه با حرف بزرگ است و ممكنه با آنها اشتباه بشه. البته اين حرفم مستند نيست و يك ترس بيهوده شايد باشه. ولي من وقتي از اسمهاي رايج انگليسي مثل start استفاده كردم در 5 مورد خطا دريافت كردم و از آن به بعد از اسمهاي فينگليش استفاده مي كنم. البته mystart استفاده مي كنم و اشكالي پيش نمي آيد. ولي بايد در اين مورد با تجربه ها نظر بدهند و محمد عزيز در چند پست قبل به يك نكته در اين مورد اشاره كرد.
با آندرلاين هم اگر در وسط كلمه باشه ، فكر نكنم مشكلي پيش بياد.

برای اسم گذاری متغییرها قواعد خاصی وجود داره که به این قواعد Hungarian Notation میگن و این چند خاصیت داره:

کد ما خوانا تر میشه در نتیجه اگه بعدا به کد مراجعه کنیم خیلی سریع می فهمیم که کار هر متغییر یا تابع چیه .
در ضمن قابلیت استفاده مجدد از برنامه رو افزایش میده .
چون موقع نوشتن برنامه اسم متغییرها ما رو گیج نمی کنه باعث میشه سریع تر برنامه رو بنویسیم که یعنی هزینه نوشتن برنامه کم میشه .
و ...


معمولا همونطور که خودت فهمیدی اسم ثابتها رو با حروف بزرگ می نویسند

برای اسم توابع هم به اینصورت عمل می کنند که حرف اول هر کلمه رو بزرگ می نویسند و بقیه حروف رو کوچک مثلا این تابع AfxEnableControlContainer(); که از ویژوال C++ آوردم . در این تابع هر کلمه با حرف بزرگ شروع شده

برای اسم گذاری متغییر ها هم مثل توابع عمل می کنند بجز اینکه اول اسم هر متغییر یک یا چند حرف کوچک که نشان دهنده نوع متغییر هست میارند مثل strLastName که str نشان دهنده اینه که این متغییر از نوع رشته ای هست و یا uNumOfStudents که حرف u نشان دهنده unsigned integer هست.

برای اسم گذاری کلاسها هم یک حرف بزرگ C به اول اسم کلاس اضافه می کنند مثل CComplex یا CCat

البته کلاسهای برلند با T شروع می شوند

گاهی هم این قواعد ممکنه در بعضی موارد با هم فرق کنه و بعضی هم قواعد مخصوص به خودشون رو استفاده می کنند

این لینکها رو هم ببینید:

http://www.gregleg.com/oldHome/hungarian.html#PREFIX

http://groups.google.com/group/comp.lang.c++/browse_frm/thread/3de205ac423933ba?scoring=d&
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
خيلي ممنون از توضيحات. خيلي خوب بود.
لينكها را هم دارم مي بينم. اول خواستم از لينكها نقل كنم ولي فكر كنم در حدي كه ما كار مي كنيم همين توضيحات بس باشه.
باز هم ممنون.
اجرتان با خدا.
.

=== ===
يك نكته اي چند ساعت پيش خواندم كه شايد بدرد كسي بخورد و عرض مي كنم. در استفاده از ماوس ، وقتي از سرويس 3 استفاده مي كنيم ، مجبوريم حلقه اي داشته باشيم براي دريافت مداوم . ولي سرويس ديگري هست كه كليك ها را در يك صف قرار مي دهد و شما با خالي كردن صف و تنظيمي مي توانيد كليك هاي راست يا چپ را كه در اين صف منتظر دريافت هستند را دريافت كنيد. سرويس 5 از وقفه 33 مي باشد.

====================
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
به نقل از saalek :
با سلام.
اولا مطالب مربوط به متغير گلوبال و توابع تودرتو و تنظيمات توربو سي را خواندم ولي طول مي كشه كه بتوانم استفاده كنم.
دوما از آقا مصطفي ممنونم كه توضيح دادند راجع به كلاس.
من خواننده پستهاي شما و آقا سعيد در اين تالار و تالار وي بي هستم و دو جمله كه مي خوانم ، كلي ديدم باز ميشه و بيشتر علاقه مند مي شم. مخصوصا مطالب مربوط به كرك و ريسورس را كه امروز خواندم خيلي لذت بردم.

راجع به خودم بگم كه من به جز كتاب آموزش سي جناب جعفرنژاد هيچ كتابي ندارم. و تقريبا هيچ پستي را از اين كتاب نزده ام چون اكثرا اين كتاب را دارند و نيازي به نقل قول نيست.
و ثانيا اين كتابي كه من دارم سي است نه سي+ .
من تمامي مطالب را از سايتهاي خارجي و ebook هاي انگليسي نقل مي كنم و چون زبانم زياد خوب نيست ، وقتي به مفاهيم مي رسم دچار مشكل مي شم. الان هم يكي دو پست از كتاب sams آماده كرده ام ولي وقتي به مفاهيم سازنده و مخرب ها رسيدم ، باز به علت ضعف زبان انگليسي دچار مشكل شدم. به همين خاطر است كه حتي چند جمله از شما و ديگر دوستان برايم كلي ارزش داره و باعث ميشه كلي در كتاب جلو برم.
مي دانم كه مطالب اين تاپيك براي افرادي در سطح شما قابل توجه نيست ولي يك كم شارژ از سوي دوستان ، كلي كمك است . مخصوصا وقتي مفاهيم مطرح است.

راجع به كلاس ، همان طور كه شما فرموديد ، بله بسيار گسترده است . من تابحال يك كلاس هم در برنامه هايم نساخته ام ولي با مطالعه گذري كتابها مي دانم كه گستردگي بحث وراثت و ديگر مباحث چقدر است. شايد از خود مباحث سي هم شي گرايي بيشتر مطلب دارد.
و مي دانم كه تمامي مباحث در طول اين تاپيك ناقص گفته شده و هر فصل نياز به دهها پست دارد ولي هدف من يك مرور سريع است و باقي كار و تكميل بر عهده خواننده است. همچنين شامل طبقه بندي مطالب كه من فعلا قادر به اين كار نيستم . چون احاطه به موضوعات هنوز ندارم.
ولي در كل همين كه مباحث توسط اساتيد مورد بحث قرار بگيرد ، باعث باز شدن راه براي مطالعه بعدي است. خيلي ها كتاب دارند ولي چون با مباحث احساس غربت مي كنند ، رغبتي براي مطالعه ندارند. و اين بحث ها كمك به درك است براي حركتي با علاقه.

بهر شكل تجربه خوبي بود و هم من كلي چيز ياد گرفتم و هم افتخار آشنايي با شما را داشتم.
و در خود احساس تعهد مي كنم كه تا حد توانم ادامه دهم. و اين تلاش اولا براي گفتن مطالب گفته نشده است و ثانيا تعميق و مهارت يافتن در مباحث گفته شده.
من يك تاپيك وي بي هم دارم . البته در سطح مبتدي. كه 204 پست خورده و در چند روز اخير حداقل 4 نفر با پيام خصوصي يا پست خواسته اند ادامه دهم. ولي چون اينجا قرار بر ادامه تا آخر است ، قبول نكردم.
با وجود تمامي نواقص تاپيك ، من ادامه مي دهم و رفع نواقص را به عهده خواننده مي گذارم ولي هر وقت توانستم تاپيكهايي بر اساس فصول ايجاد مي كنم . ولي فعلا همه مباحث را به جز گرافيك در اين تاپيك ادامه مي دهم . و كلاس را هم همين جا پست مي زنم. و كمك دوستان حتما باز كننده راه است.
.
بابا اينقدر شرمنده نكن.
من خودم هم خيلي حاليم نيست، فقط سعي مي كنم اگه چيزي بلدم بگم.
دوستان ديگه اي اينجا هستند كه اطلاعات برنامه نويسي شون خيلي خيلي بيشتر از منه.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نقل از saalek :
با سلام.
آقا مصطفي حتما شما درست مي گوييد ولي كسي مي تواند دو نفر را مقايسه كند كه بالاتر از هر دو باشد و من چون پايين تر از هر دو (شما و افرادي كه مي فرماييد) هستم ، همه مي شوند بالا. و اين امري طبيعي است و شما هم بنوبه خود up و down خود را مي توانيد مشخص كنيد. ممنون از شما و موفق باشيد.
=== ===
يك نكته اي چند ساعت پيش خواندم كه شايد بدرد كسي بخورد و عرض مي كنم. در استفاده از ماوس ، وقتي از وقفه 33 استفاده مي كنيم ، مجبوريم حلقه اي داشته باشيم براي دريافت مداوم . ولي وقفه ديگري هست كه كليك ها را در يك صف قرار مي دهد و شما با خالي كردن صف و تنظيمي مي توانيد كليك هاي راست يا چپ را كه در اين صف منتظر دريافت هستند را دريافت كنيد. فكر كنم وقفه 5 بود. بعدا شايد گفتم. ولي شما با سرچ مي توانيد به اين هدف برسيد.
.
====================
سالک جان مطمئنی وقفه پنج بود
اخه 5 یه وقفه سطح پایین بایوس است که باعث چاپ اطلاعات موجود در ناحیه ویدئو می شه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
سلام آرش جان.
ببخشيد من تنبلي مي كردم بروم نگاه كنم.
سرويس شماره 5 بود از وقفه 33.
خوشحالم مي بينمتان.
.
پس وقفه 5 غلط بود و سرويس 5 بود از وقفه 33.
============
پست مربوطه را اديت كردم.
با تشكر از تذكر.
.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نقل از saalek :
سلام آرش جان.
ببخشيد من تنبلي مي كردم بروم نگاه كنم.
سرويس شماره 5 بود از وقفه 33.
خوشحالم مي بينمتان.
.
پس وقفه 5 غلط بود و سرويس 5 بود از وقفه 33.
============
پست مربوطه را اديت كردم.
با تشكر از تذكر.
.
این سرویس پنج هم فثط اطلاعات کلیک رو بر می گردونه
فکر کنم منظور شما سرویس 0cH از وقفه 33H باشه که یه دستیاب برای حوادث ماوس می ایجاد می کنه;)
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام مجدد.
سرويس صفر چك مي كنه كه ماوس در دسترس هست يا نه.در همين تاپيك برنامه اش هست.
سرويس 5 را برنامه اش را مي نويسم. البته اگر نتوانستم به مرحله استفاده برسونمش(مرحله چك) آنوقت فقط نقل مي كنم خدمتتان تا خودتون رديفش كنيد.
.
============
اي واي من اشتباه ديدم شما گفتيد 0c نه 0 .
دنبال اونم مي رم.
.
==================
==================

وقفه را بگذار روي 33
سرويس را بگذار روي 5

اگر كليك چپ مي خواهي bx را صفر كن
اگر كليك راست مي خواهي bx را يك كن
.
- -- --- -- -- -- -- --- --- ---
دريافت پاسخ:
رجيستر bx ميشه تعداد كليك
رجيستر cx ميشه ستون آخرين كليك
رجيستر dx ميشه رديف آخرين كليك

== = = = = == = = = = == = = = = =
اگر زودتر از من برنامه اش را نوشتي و چك كردي ، پست بزن.
من هم بروم برنامه اش را بسازم.
.
=========================
سرويس شماره 6 هم مثل سرويس شماره 5 است ولي فرقش اينه كه تعداد رها كردن ها و محل آخرين رها كردن ماوس را نشان مي دهد.
پس براي درگ كردن(گرفتن چيزي با ماوس و بردن به جايي ) كاربرد داره.
.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
من گفتم 0c اگه خواستی یه برنامه با این برات می نویسم

حتما می دونی که من اسمبلی بلد نیستم اگه بنویسم هم باید از روی کتاب بنویسم
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از :
http://www.stackless.com/wiki/CStack



Every C program uses memory areas that are called stack and heap. The heap is the memory that can be used by a program via memory management functions. The stack is the memory area, that contains the local variables. On every function call, a stack area is created. Especially with recursive functions, the stack size can grow unbounded. This is a problem, since the stack size cannot be changed, it is a limited resource.

Stackless has several techniques to deal with this problem.
In Stackless 1.0, C stack was saved by avoiding its usage wherever possible.
In Stackless 2.0, C stack was saved by storing pieces in heap-allocated memory and re-using the same stack.
In Stackless 3.0, both techniques are combined.

XXX lead to some more detailed pages for technically curious people



هر برنامه سي از دو قسمت stack و heap استفاده مي كند. Heap حافظه اي است كه مي تواند مورد استفاده قرار گيرد با توابع مديريت حافظه.
پشته ، stack قسمتي از حافظه است كه شامل متغرهاي موضعي(لوكال) مي باشد. در هر فراخواني تابع ، يك منطقه پشته ايجاد مي شود. مخصوصا با توابع بازگشتي ، اندازه پشته مي تواند بي اندازه بزرگ شود. اين يك مشكل است. زيرا كه اندازه پشته قابل تغيير نيست. و اين يك محدوديت ريسورس است.
3 راه براي حل اين مشكل وجود دارد:
راه اول : هر وقت مي شود با استفاده نكردن(شك در ترجمه-به بالا مراجعه) اين كار را كرد.
راه دوم: پشته را به heap منتقل كنيم و دوباره از همان پشته استفاده كنيم.
راه سوم: تركيب 2 راه بالا.
== = = == = == = == = == = == = = =

سالك: فعلا راجع به پشته و حافظه heap و كلا مديريت حافظه ، يكسري مقالات پراكنده و نيمه ترجمه مي زنم. تا همه ، يك جا، جمع باشند و بشه جمع بندي كرد.
اگر استفاده از اين نوع مقالات براي شما مشكل است ، فعلا نخوانيد تا من با كمك اساتيد بتوانيم جمع بندي كنيم.

من در دو روز گذشته يكسري map از حافظه ديدم كه هر يك با تصاويري سعي داشت موقعيت heap و پشته را نشان دهد. ولي نتوانستم جمع بندي كنم. و يك جدول از آدرسهاي دقيق در سيستمهاي مختلف(IBM و غيره) هم بود كه خيلي مفصل بود. و بعدا عكسهاشو اگر مناسب تاپيك بود مي زنم.

فعلا مي خواهم اين مقالات ناقص را روزنامه اي با هم بخوانيم تا به تدريج يك نگرش خوبي به كار پيدا كنيم. بعدا جمع بندي و دسته بندي و اصلاح و عرضه مي كنيم.

توابع بازگشتي: تا آنجا كه من بلدم ، توابعي است كه خودش را صدا مي كند. مثلا برنامه اي براي محاسبه فاكتوريل عدد ديدم كه عدد را با قبلي خودش ضرب مي كرد و باز خود را در شرايطي صدا مي كرد تا همه اعداد قبل عدد مورد نظر، تا عدد يك، در هم ضرب شود. شايد استفاده از توابع بازگشتي براي محاسبه فاكتوريل يك عدد ، بهترين راه باشد.
.
من خودم الان روي محل قرار گيري قطعه پشته و داده و بقيه مشكل دارم و محل پشته و محل حافظه HEAP را هم درست نمي دانم . بعد چند تا مقاله اين طوري كار راحت تر مي شود براي جمع بندي.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از:
http://www.csd.abdn.ac.uk/~jrl/teaching/CS3008/lecture/l3/l3.htm


C and memory
When we define a new variable, there are three places the where the compiler may reserve space for it:

سي و حافظه:

وقتي كه ما يك متغير جديد تعريف مي كنيم ، سه مكان مختلف در حافظه ، كامپايلر در نظر مي گيرد.


global variables
in the data segment: a patch of memory reserved by the compiler for global variables - whether explicitly defined, or created by the compiler.

C compilers give the data segment an initial value, which is zero unless you have initialised a variable.

A genuine zero - bit pattern 0000..00 - translates to
0 - for integer types.
0 - for floating point types (if the representation is not 0, then the compiler initialises the space to floating point 0).
null pointers.
On serious unix machines, the data segment may be a big as you need. But note that initialised data is part of the executable file.

The compiler knows the address of global variables.

متغير گلوبال:
در سگمت داده ،data segment ، يك تكه از حافظه براي متغيرهاي گلوبال در نظر گرفته مي شود. چه صريحا ما تعريف كرده باشيم ، چه توسط كامپايلر تعريف شده باشد.
كامپايلر سي ، در قطعه داده ، يك مقدار اوليه براي آنها در نظر مي گيرد ، كه صفر است تا زماني كه شما مقداري به آنها بدهيد.كه اين صفر براي اينتيجر ميشه صفر و براي float هم صفر(...مراجعه به شرح بالا ...) و اشاره گر هم null ميشود. سالك: يعني اشاره گري كه به جايي اشاره نمي كند.
در ماشينهاي يونيكس ، ديتا سگمنت مي تواند به اندازه اي كه شما مي خواهيد بزرگ باشد. اما ..

كامپايلر آدرس متغير گلوبال را مي داند.


local variables
on the stack : when a function is called, the caller reserves space on the stack for its local variables, for the arguments, and for the return address.

Because we always return from one procedure before we return from its caller, stack discipline works. This mechanism allows heavy reuse of space, and allows recursive functions.

The snag is that local variables are not automatically initialised: they become whatever bit pattern was left in that stack space.

It is not a good idea to return a pointer to a local variable. The memory will still be addressable, but its contents depend on later function calls.

The start-up sequence of a program allocates memory for the stack, and puts that into the stack pointer.

When a function is called, it adds enough to the stack pointer so that there is enough space for the return address of the function, and for all the local variables.

a local variable might be addressed as (sp-12).

متغير لوكال(موضعي):
در پشته.(است)
وقتي يك تابع فراخوانده مي شود ، براي متغيرهاي موضعي ، آرگومنت ها و آدرس بازگشت تابع توسط صدا زننده در پشته جا رزرو مي شود.
ايده خوبي نيست كه يك اشاره گر را به يك متغير موضعي نسبت دهيم. زيرا حافظه آدرس دار است ، اما محتويات بسته به احضار بعدي است. (س: بايد شفاف شود كه من بلد نيستم.)
قسمتهاي start-up هر برنامه ، مقدار حافظه لازم براي پشته را تخصيص مي دهد و در stack pointer آدرس را قرار مي دهد. (س: قسمتهاي استارت آپ فكر كنم مربوط به تعريف مدل حافظه و چيزهاي ديگر است كه توربو سي ما معمولا روي small تنظيم است و يكسري تنظيمات ديگر كه اندازه و موقعيت پشته را مشخص مي كند و استك پوينتر يا اشاره گر پشته ، آدرسي است كه امكان استفاده درست از پشته را مي دهد.)
وقتي تابعي فراخوانده مي شود ، استك پوينتر اضافه مي شود . تنظيم براي آدرس بازگشت و متغيرهاي لوكال .


run-time allocations
you may allocate memory on the heap at run time.

تخصيص حافظه موقع اجرا:
شما ممكنه حافظه اي را در heap در زمان run time به كاري اختصاص دهيد.
(س: allocate در فرهنگ لغت به معني اختصاص دادن . معين كردن است.)
.
=====================
اگر كسي نفهميد ، من هم خيلي قسمتها را نفهميدم. مطمئن باشيد من اگر چيزي را بفهمم در بوق و كرنا مي گم . يعني عكس مي كشم ،رنگ مي كنم،هوار مي كنم و .... نه اينجوري، يواشكي.
فعلا يك مروري بكنيد . باز تكرار ميشه همه بحثها . آنقدر تكرار تا بديهي شود.
.
===============================
راستي يك چيزي الان با خوندن اين مقاله يادم آمد.
من براي بازي خود(برنامه نوشته شده خود) دو تا آرايه بزرگ دو بعدي و گلوبال ساختم. مثلا 100 در 100 ، سومي را كه خواستم بسازم ، نگذاشت .

فكر كنم حالا علتشو و راه حلشو فهميدم.
علتش اين بوده كه در سگمنت داده ساخته مي شده و چون محدود بوده فضايش ، بيشتر نداشته بدهد. با توابع تخصيص حافظه كه فكر كنم از heap مي گيره حافظه را فكر كنم اين مشكل حل مي شده.
اساتيد محترم ، آيا اين علت و اين راه حل كه من گفتم درست بود؟؟
.
يك چيز را هم بايد نگاه كنم و تنبلي مي كنم. فكر كنم در كتاب جناب جعفرنژاد گفته بود در مدل small قطعه داده و قطعه پشته يكي است. يعني هر دو با هم مي شوند 64 كيلو(عدد را شك دارم) ، پس تمامي متغيرهاي گلوبال(كه جاشون در قطعه داده است) و متغيرهاي لوكال(كه جاشون در پشته است) بايد مهربون كنار هم در اين قطعه 64 كيلويي بنشينند(در مدل small ) و حافظه heap هم اونور خودشو باد بزنه و كاري انجام ندهد!!
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از:
http://www.codersource.net/c++_dynamic_memory_allocation.aspx


290n1.gif


زماني كه شما نوشتن برنامه را تمام كرديد و خواستيد نتيجه كار را ببينيد، دكمه هايي را براي كامپايل و run مي زنيد.
اما واقعا چه اتفاقي مي افتد ، وقتي كه شما اين دكمه ها را مي زنيد؟
جواب: پروسه كامپايل ، برنامه c++ شما را به زبان ماشين ترجمه مي كند. به تنها زباني كه كامپيوتر مي فهمد.
سپس برنامه شما ، حافظه هايي براي كار تدارك مي بيند كه شامل سه قسمت است:
قسمت اول: قسمت كد ، كه كدهاي شما آنجا مي نشيند.
قسمت دوم: قسمت ديتا سگمنت كه متغيرهاي گلوبال را در خود نگه مي دارد.
قسمت سوم: كه متغيرهاي لوكال local و بقيه اطلاعات موقتي را نگه مي دارد.
.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
در مورد تفاوت heap و stack بایئ توجه کرد که اندازه stack دقیقا در زمان کامپایل مشخص می شه اگه شما به اسمبلی برنامه نوشته باشید دقیقا با این کار اشنا هستید اما heap ما بقی حافظه است که می شه هر زمانی ازش استفاده کرد
البته استفاده از heap و اندازش بستگی به سیستم عامل و نحوه مدیریت حافظه داره
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نكات مهم و خوبي اشاره كرديد.
بله اندازه استك در موقع كامپايل مشخص مي شود. و حافظه آزادبستگي به فاكتورهايي مثل سيستم عامل و سخت افزار و چيزهاي ديگه دارد. راهنمايي شما كمك مي كنه تا اين فاكتورها را من جستجو كنم و عرض كنم.

.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از:
http://www.codecomments.com/C/message789025-2.html
اين يك فروم است و شايد بحثها زياد معتبر نباشد ولي نظارت اساتيد ، ضامن اصلاح است.


285n1.gif


در شكل بالا ، 4 قسمت در Ram براي قطعات برنامه سي در نظر گرفته شده.
متغيرهاي گلوبال را در قسمت Initialized ديتا سگمنت در نظر گرفته كه من خودم دقيقا نمي دانم منظور از Initialized در اينجا چيست. ولي قبلا ترجمه كرديم به ((مقدار اوليه داده شده)).

نكته جالب بعدي در اين شكل اين است كه متغيرهاي استاتيك را هم در (( ديتا سگمنت )) جايش را دانسته(كنار گلوبالها) .


285n2.gif


در شكل بالا ، كمي جزئيات بيشتري مشاهده مي شود.
در قسمت stack ، متغيرهاي موضعي.
در قسمت heap با ((ديناميك الوكيشن)) استفاده مي شود مثلا با malloc,calloc . محمد عزيز در اين تاپيك يكبار استفاده از اين تابع را شرح داده بود.

قسمت bss مخصوص uninitialized data .

قسمت ديتا سگمنت براي متغيرهاي گلوبال و استاتيك .

قسمت text segments براي constants (ثابت ها ، ثوابت)

سالك: قسمت text را من خودم كدهاي برنامه نويسي دانستم. اگر اشتباه گفتم دوستان اصلاح كنند. و اگر كل دياگرام بالا هم غلط بود يا باعث بدآموزي بود بفرماييد.
.

==========================================

از:
http://www.thescripts.com/forum/thread218336.html
اين مطلب هم از فروم است.

Let's make things clear.

There are no 'Constant Variables' in C. A constant [expression] can't
be a variable. Its a datum that is not an object. It has no address.

A variable can have the 'const' qualifier. In that case, it is defined
read-only (not 'constant'). Being a variable, it's an object, and yes,
it has a memory location, hence an address.

The 'const' qualifier can be used by the linker to place the data in a
'read-only' region when possible.

ترجمه: اجازه دهيد مطلب را شفاف كنيم.
(( متغير ثابت constant )) در زبان c نداريم. يك ثابت (expression ) نمي تواند يك متغير باشد. ان فقط يك اطلاع رساني است نه يك آبجكت(شي) . ثابت ، آدرسي ندارد.
يك متغير مي تواند يك 'const' qualifier داشته باشد. (س: پيش نويس const ) . در آن مورد ، ما آن را reed-only مي دانيم نه كنستانت.
وقتي ما يك متغير داريم ،آن يك شي است و بله ، آن يك موقعيت در حافظه دارد. (و يك آدرس)
و 'const' qualifier مي تواند استفاده شود بوسيله لينكر ، تا ديتا را در منطقه read-only قرار دهد.
(سالك: بايستي توضيح كاملتري راجع به مراحل كامپايل و لينك داده شود. و وظايف لينكر و كامپايلر و تقدم و تاخر زمان فعاليت هر يك مشخص شود. ولي فعلا ، اين طور در نظر بگيريد كه ما دستوراتي را مي نويسيم كه لينكر بخواند و دستوراتي را مي نويسيم كه كامپايلر بخواند و دستوراتي را مي نويسيم كه كامپايل شود. == طلب اصلاح و تكميل ==
راجع به منطقه read only هم من نمي دانم كجاست . مطالب بالا براي اين گفته شد كه ، فقط به اين دليل كه ، بدانيد نبايد دنبال آدرس حافظ يك مقدار ثابت بگرديد ، چون اصلا وجود ندارد. ولي اگر بي سوادي و تنبلي مانع نبود ، بايد اينجا سينتكس كدنويسي
حالتي كه بي آدرس است
و حالتي كه ثابت است ولي آدرس دارد ،
نوشته مي شد. )

========================

يك سئوال از اساتيد:
ما وقتي از حافظه صحبت مي كنيم ،آيا فقط محدوده آدرس دهي ما حافظه فيزيكي است يا حافظه ويرچوال هم شاملش است؟
زيرا من فكر مي كنم كه ويرچوال در ويندوز ايجاد مي شود و برنامه هاي ما dos ئي است.

= = = = =
توضيح براي ديگر دوستان : حافظه ويرچوال حافظه اي است كه در حقيقت در Ram نيست و در Hard است. سيستم هايي (فكر كنم kernel ) باعث مي شوند كه قسمتي از هارد بتواند به عنوان حافظه(مجازي) عمل كند. البته چون دسترسي هارد دورتر است از Ram ، سرعت برنامه هايي كه از اين نوع حافظه استفاده مي كنند ، پايين ميايد. ديگه من چيزي نگم بهتره چون واقعا دوستان استاد اين قضايا هستند. و شرح خواهند داد. (در اين چند خط توضيح ويرچوال memory هم اگر غلط داشتم بفرماييد)
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
از:
http://www.dirac.org/linux/gdb/02-Memory_Layout_And_The_Stack.php


286n1.gif



Text Segment: The text segment contains the actual code to be executed. It's usually sharable, so multiple instances of a program can share the text segment to lower memory requirements. This segment is usually marked read-only so a program can't modify its own instructions.

قطعه text : قطعه text ، شامل كدهاي واقعي است كه بايستي اجرا شوند. اين قسمت معمولا قابل به شراكت گذاشتن است. پس ، قسمتهاي مختلف برنامه(رجوع به متن اصلي) مي تواند قطعه text را به شراكت بگذاريد براي كاهش مصرف حافظه.
اين قطعه read-only است. پس يك برنامه نمي تواند كدهاي خودش را دستكاري كند.


Initialized Data Segment: This segment contains global variables which are initialized by the programmer.

قسمت اينيتيالايز قطعه ديتا: اين قطعه شامل متغيرهاي گلوبالي است كه اينيتيالايز شده اند بوسيله برنامه نويس.


Uninitialized Data Segment: Also named "bss" (block started by symbol) which was an operator used by an old assembler. This segment contains uninitialized global variables. All variables in this segment are initialized to 0 or NULL pointers before the program begins to execute.

قسمت اينيتيالايز نشده قطعه داده: (كه اغلب bss ناميده مي شود به معني بلوكي كه با سيمبول ها شروع شده. كه اپراتوري است كه بوسيله يك اسمبلر قديمي استفاده مي شود.) اين قسمت شامل متغيرهاي گلوبال مقدار دهي نشده است. تمامي متغيرها در اين قسمت با 0 يا null pointer مقدار دهي مي شوند قبل اجراي برنامه.


The stack: The stack is a collection of stack frames which will be described in the next section. When a new frame needs to be added (as a result of a newly called function), the stack grows downward.

پشته: پشته حاوي مجموعه اي از عناصر ايست ...(به بعد موكول كرده).


The heap: Most dynamic memory, whether requested via C's malloc() and friends or C++'s new is doled out to the program from the heap. The C library also gets dynamic memory for its own personal workspace from the heap as well. As more memory is requested "on the fly", the heap grows upward.

heap : بيشتر حافظه ديناميك ، بوسيله malloc و دوستانش (از سي) و new (از سي++) اخذ شده. كتابخانه سي ، همچنين حافظه ديناميك خود براي workspace را از heap اخذ مي كند. هر قدر كه heap بزرگ شود ، به سمت بالا رشد مي كند. (س: در شكل بالا نشان داده شده. قسمت پايين عكس low address است و قسمت بالا high .)
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ما وقتي از حافظه صحبت مي كنيم ،آيا فقط محدوده آدرس دهي ما حافظه فيزيكي است يا حافظه ويرچوال هم شاملش است؟
زيرا من فكر مي كنم كه ويرچوال در ويندوز ايجاد مي شود و برنامه هاي ما dos ئي است.

برنامه های تحت داس 16 بیت کامپایل می شوند می این یعنی باید ادرس ها در 16 بیت بیان بشه خود به خود محدودیت در استفاده از حافظه به وجود می یاد به طوری که فقط می شه 2 به توان 16 بایت رو ادرس دهی کرد پس توی شما زیاد رو این حساب نکنید که بشه از حافظه مجازی هم استفاده کرد اما در کل مدریت حافظه جازی به عهده سیستم عامل هست و برنامه ی شما با اونن مانند هر حافظه ی دیگه ای استفاده می کنه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
خيلي ممنون . لطف كرديد. فقط جهت كسب اطلاعات مي خواستم و تبادل نظر. فعلا قصد استفاده نداريم.
.
ولي اين قضيه كه بالاخره موقعي كه داريم برنامه امان را اجرا مي كنيم ، سيستم عامل ما ويندوزه يا داس ، من سردرنياوردم.
.
قضيه 16 بيت و 32 بيت را اگر ميشه كمي بيشتر شرح بدهيد. با جوانب . مثلا ... نمي دونم.... مثلا اندازه باس...داخل سي پي يو... و هر جاي ديگه.
.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
در ویندوز شما می توانید برنامه های تون رو همون گونه که تحت داس می نوشتید بنویسید و هیچ مشکلی پیش نمی یاد
البته خانواده NT با بعضی از وقفه ها مشکلاتی دارن که زیاد به چشم نمی یاد

در مورد 16 32 64 بیتی هم باید به عرض برسونم اینها رو می شه به چند زور برداشت کرد یکی طول ادرس دهی حافظه

بزرگترین ثبات CPU در حالت استاندارد می شه و یه چیزا دیگه که من بلد نیستم
 

mostafa_gm

Registered User
تاریخ عضویت
4 آپریل 2005
نوشته‌ها
1,863
لایک‌ها
438
محل سکونت
My House
تو C نميدونم ولي تو ++VC حافظه stack رو ميشه تا 2 گيگ و روي حافظه مجازي تخصيص داد.
 
بالا