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

سوالات پايه اي زبان سي و پلاسش

Arash_j13

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

اگه هم می خواید به روش مهندس های 40 سال پیش کار کنید کامپایلر ها رو بزارید کنار اول شروع کنید به نوشتن یه اسمبلر بعد با اون می تونید کامپایلر بنویسید بعد سیستم عاملتون رو بسازید البته اگه سیستم عاملتون ساده باشه می تونید تو همون مرحله بعد از ساختن اسمبلر با اسمبلی بنویسیدش یا اینکه مستقیما به کد ماشین بنویسیدش مطمئئن شما داستان ساخت سی رو خونید که چطور مهندس های MIT یه سیستم عامل رو مستقیما با کد ماشین نوشتن اگه شما حوصله اینکار رو دارید هیچ محدودیتی ندارید می تونید شروع به نوشتن کنید اول سیستم بوت بعد مدیریت حافظه و پردازنده بعد اگه خواستید مدیریت حافظه جانبی و سیستم فایل باید تمام اینها از ابتدا به کمک کد ماشین طراحی بشه
 

sub

Registered User
تاریخ عضویت
22 آپریل 2006
نوشته‌ها
332
لایک‌ها
1
محل سکونت
سابستان
من تاحالا اصلاً با لینوکس کار نکردم این امکان هم وجود نداره که باهاش آشنا بشم.
در مورد برنامه ای که می خوام بنویسم، این امکان مورد نیاز هست که من بتونم بیت بیت هارد رو بخونم. هر جایی از هارد که باشه.
در ضمن اگه بتونید برام اون نسخه ای از C که مایکروسافت باهاش ویندوز رو می نویسه گیر بیارید، مشکل حل میشه. اون روش که چهل سال پیش مهندسان استفاده کردند هم که ولش کن.
فقط من یه چیز می خوام.
کامپایلری از C که نیاز به هیچ OS نداشته باشه و بدون سیستم عامل بالا بیاد
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
من فکر نمي کنم که امروزه مايکروسافت از سي به عنوان زبان اصلي استفاده کنه
همچنين اون سي که قديما ازش استفاده ميشده باز نياز به os داشته که از قبل ميکروسافت طراحي کرده بود
پس اين ها رو بايد پذيرفت ،

اما تا جايي که ميدونم شما براي دسترسي به حافظه جانبي مشکلي نداريد چه با سي و چه اسمبلي win32 که در سطح زباني بالا هستند و چند کتاب خوب در زمينه برنامه نويسي os و win32 و .....(با همين asm ها)

وگر نه بايد يک اسمبلر براي cpu تون بنويسيد
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به نقل از sub :
من تاحالا اصلاً با لینوکس کار نکردم این امکان هم وجود نداره که باهاش آشنا بشم.
در مورد برنامه ای که می خوام بنویسم، این امکان مورد نیاز هست که من بتونم بیت بیت هارد رو بخونم. هر جایی از هارد که باشه.
در ضمن اگه بتونید برام اون نسخه ای از C که مایکروسافت باهاش ویندوز رو می نویسه گیر بیارید، مشکل حل میشه. اون روش که چهل سال پیش مهندسان استفاده کردند هم که ولش کن.
فقط من یه چیز می خوام.
کامپایلری از C که نیاز به هیچ OS نداشته باشه و بدون سیستم عامل بالا بیاد

برای دسترسی سطح پایین هارد وقفه های سطح پایین بایوس به کمکتون می یاد البته فکر کنم روی اکس پی جواب نده من امتحان نکردم ولی نیاز به زبان ماشین نداره کارتون با سی و اسمبلی به صورت ترکیبی راه می یوفته

در مورد اینکه می گید کامپایلر بدون سیستم عامل بالا بیاد چند تا مشکل هست

اول بالا اومدن یا به عبارت دیگ بوت شدن این وظیفه سیستم عامل هست
دوم فایل هایی که با ید کامپایل بشن باید یه جایی باشن مثلا رو یه دیسکت و این دیسک نیاز به سستم فایل داره که مدیریتش به عهده ی سیستم عامل هست و همچینین فایل های تولید شده باید یه جای نوشته بشن که با نیاز به مدیریت سیستم عامل بر روی حافظه های جانبی هست
تازه این کامپایلر باید بتونه برای خودش مدیریت حافظه بکنه و حافظه مورد نیاز برای اجرای خودش رو درست تخصیص بده


اگه تمام این کار ها انجام بشه دیگه اسم این برنامه کامپایلر نیست بلکه یه سیستم عامله پس در حالت کلی کامپایلر ها سطح با لاتر از اونی هستن که بدون سیستم عامل اجرا بشن
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
فکر کنم تمامي ابهامات رفع ميشه با اين وجود
 

apache**

کاربر تازه وارد
تاریخ عضویت
15 جولای 2006
نوشته‌ها
26
لایک‌ها
0
محل سکونت
Tehran
خوب سیستم عامل !
وقتی می خوایم یه سیستم عامل بنویسیم این به این معنی نیست که بدون سیستم عامل دیگه کامپایلش
کنیم!
چون اینجوری تصور میشه که فایلهای اجرایی ما وابسته به اون سیستم عامل می شن
ولی یه سری فایلها و برنامه های اجرایی هستن که باید یه جور عمل کنن!
همونطور که boot شدن linux و win هر دوشون از یه روند پیروی می کنن!

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

البته مسئله اصلی ما یافتن یه فایل اجرایی و یک ترجمه دودویی global هست که فقط به cpu
کار داشته باشه نه سیستم عامل واسط یعنی یه فایل اجرایی که exe نباشه و اجرایی لینوکس
نباشه ولی تو هر دو سیستم عامل عین هم اجرابشه!
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
منظور شما اینه که اول بوت رو طراحی باید کرد بعد یک سری سرویس(همان اجزایی که آقا آرش گفت ) ، بعد اسمبلر (یا کامپایلر که بعیده) ؟

ولی اگر دوباره بخواهیم کد های در مبنای cpu بنویسیم در حقیقت داریم os می نویسیم یا به نحوی اسمبلر ، که هنوز بهش نمیشه گفت کامپایلر چون در گیر مسائل سطح پایین ، همینطوره ؟
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
حتما لازم نیست هر کدی که در فقط به CPU ربط داره سیستم عامل باشه شما می تونید یه برنامه hello word !!! بنویسید مستقل از سیستم عامل با کد های دو دویی ریزپردازنده و به کمک وقفه ها ابتدایی بایوس ولی مسئله اینکه یکی باید این برنامه رو اجرا کنه پس اول باید سیستم بوت بشه حالا ممکنه یه سیستمی که مدیرت بالایی رو برنامه ها داره مثل ویندوز یا لینوکس نزاره این کد رو اجرا کنید و یه سیستم عامل دیگه مثل داس بزاره ولی در هر حال کد شما بستگی به سیستم عامل نداره ولی خودشم سیستم عامل نیست
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
مي تونيم اين نتيجه رو بگيريم که يک سري امکاننات براي بخشهايي در قسمت کلاس ها گرفتا شده که در خارج از کلاس گرفته نشده ؟
مثل :
کد:
class {
func() const;
{;
اما براي توابع يک همچين چيزي نداريم (البته من نديدم)
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خب این برای توابع خارج از کلاس معنی نداره
وقتی شما یک تابع رو به صورت ثابت تعریف می کنید به کامپایلر می گید که اشاره گر this یک اشاره گر ثابت باشه
کد:
cost class_name * const this

تا بتونه برای یک ابجکت ثابت این تابع رو فراخوانی کنه ولی در خارج کلاس که ابجکتی وجود نداره اشاره گر this بی معنی پس اصلا بحث ثابت بودن یا نبودنش پیش نمی یاد که قرار باه یک تابع ثابت تعریف بشه
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
گرفتم ، از بابت راهنمايي تشکر

حالا که بحث تابع شد الآن توي اين برنامه scope متغييرk تا پايان برنامه هست - يا - در همان تابع تموم ميشه و مقدار خروجي براي اشاره گر بودنه ؟
کد:
int *func()
{
	int *k = new int(10) ;
	return k;
}
int main(int argc, char* argv[])
{
	int *ptk = func();
	cout << *ptk;
	getch();
	return 0;
}
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
يک همچين چيزي ديدم :

As just discussed, the situation in C is simple: the programmer need not worry about the destruction of static or automatic entities yet is fully responsible for the destruction of dynamic data. With C++ objects, the programmer must now worry about dynamically allocated parts of automatic objects. It comes as no surprise that automatic objects with dynamically allocated parts are the largest cause of memory leaks
فکر کنم با اين وجود توي تابع بالا حافظه هدر رفته
--------------------------
احتمالا 2 جور رفته :
1- که delete نکرديم
2-ptr رو null نکرديم (اگر delete هم مي کرديم ، ديگه حتما لازم نبود ptr رو null کنيم ؟ ، )
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
حالا يک نکته ديگه
آيا اينجا اون obj بي نامي که درست شده حافظه هدر ميده ؟
کد:
class tst
{
	const int x,k;
	public :
		tst(int j=0,int n=0) :x(j),k(n) {}
};

int main()
{
	const tst obj = [b]tst(10,5) ;[/b]
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
اون متغییر k اسکوپش اسکوپ بلاک هست و فقط توی بلاک خودش معتبر هست ولی حافظه ای که بهش اشاره می گنه و با New تخصیص داده شده تا وقتی ازاد نشه باقی می مونه پس مقداری که تابع برمی گردونه معتبره و آدرس یه بلوک 40 بایتی از حافظه هست
ولی چون حافظه رو بعد از استفاده ازاد نکردید اون رو هدر دادید هر new حتما یک delete متاظر باید داشته باشه
اگه بخوایید اصولی برنامه بنویسید بعد از هر new حتما باید کنترل کنید که مقدار اشاره گر NULL نشده باشه اگه این اتفاق افتاده باشه یعنی سیستم عامل نتونسته حافظه مورد نیاز رو تخصیص بده و باید اقدامات لازم رو انجام بدید تا اتفاقات غیر منتظره ای نیوفته مثلا می تونید برنامه رو ببینید یا اگه می توند حافظه ازاد کنید یا هر کار که ممکنه انجام بدید

ولی بعد از delete کردن لازم نیست که اشاره گر رو NULL کنید

نه چون از اشاره گر استفده نکردید C++ oودش حافظه رو مدیریت می کنه یک ابجکت موقتی می سازه اون رو درون ابجکت اصلی کپی می کنه و بعدا خودش ابجکت موقتی و اصلی رو نابود می کنه و شما اصلا نباید نگران مدیریت حافظه باشید البته این تاوقتی یه که با new حافظه تخصیص ندادید یه قاعده کلی هست که می گه هر کسی مسئول کار خودشه مسئول حافظه ای که C++ تخصیص داده خود C++ هست و مسئول حافظه ای که شما تخصیص دادید خود شما هستید
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
توضیحات خیلی خوب بود
--
اما اگر new نتونه تخصیص بده ، برنامه مگه Auto بسته نمیشه ؟
 

Arash_j13

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

ebrahimj

Registered User
تاریخ عضویت
13 اکتبر 2004
نوشته‌ها
316
لایک‌ها
1
محل سکونت
pp
من بحث هاي قبلي مربوط به اجراي يك برنامه مستقل از سيستم عامل رو خوندم .

به نظر من منظور دوستان برنامه هاي bootable و .. باشه . مثلا برنامه هاي نصاب ويندوز !

يك برنامه ساده . كه مثلا helloword را چاپ كند و چند عمل ساده را انجام دهد .

حالا اين موارد را بقير از زبان ماشين نميشه جور ديگه اي نوشت ؟!
 

Mehdi.T

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
30 سپتامبر 2005
نوشته‌ها
506
لایک‌ها
3
محل سکونت
In Search of Sunrise
اکثر زبان ها نياز مند کتابخونه هاشون هستند ، و اونها به تبع نيازمند OS ميزبان
بنابر اين نميشه برنامه اي نوشت که خارج از os کار کنه مگر برنامه اي که شرط بالا رو نقص کنه
 

ebrahimj

Registered User
تاریخ عضویت
13 اکتبر 2004
نوشته‌ها
316
لایک‌ها
1
محل سکونت
pp
خوب بطور حتم بايد پلاتفرمي براي اينگونه موارد وجود داشته باشد ، من خودم هنوز به چنين موردي بر نخورده ام ،‌ ام فكر ميكنم كه اين موجود ، براي اين كار وجود دارد .
 

Arash_j13

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