PDA

نسخه کامل مشاهده نسخه کامل : چند تا سوال از سی دارم



havva
03-09-2006, 20:10
سوالاتب ساده از c
1- می بینید گه گاهی در تابع main توی اون پارانتز ها می نویسیم متغیر ها رو مثل همین
main(int argc, char *argv[])
می خواستم ببنم این درسته که مثلا برای اینکه فایل برنامه ی ما بعدش مثلا برای اجراش اسم فایل مورد نظر رو می دیم یعنی منظورم اینه myprog.exe file.txt منظورم اون قسمت file.txt است بابا یک کلوم چرا شما و خودم رو گیج کنم هزار بار این قسمت کتاب رو خوندم در این مورد ولی هیچی نفهمیدم می خوام برام یاد بدین که چطور یه برنامه سازم که اول اسم برنامه و بعد اسم فایل ورودیش رو بدم و اگه فقط اسم برنامه رو دادم راهنمای استفاده از اون رو بده یعنی فقط اموزش این قسمتش رو می خوام که اگه فقط فایل اجرایی برنامه ام رو تنها زدم بیاد نحوهی کار کردش رو در اعلان داس بنویسه و در بعد بشه بهش فایل داد ممنون اگه توضیح بدین می دونم خدم هم سوالم رو درست نپرسیدم چون خودم چیزی نمی دونم ازش تا سوالم رو واضح تر بپرسم خیلی هم مبتدی نیستم تا حدود هایی با سی اشنا هستم ولی این ها رو نمی دونم

2- می شه در مورد این نوشته برام توضیح بدین
char xlat[] = {
0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f,
0x41, 0x2c, 0x2e, 0x69, 0x79, 0x65, 0x77, 0x72,
0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44, 0x48, 0x53,
0x55, 0x42
};


می دونم سوالام خیلی اعصاب خراب کنن ولی ببخشید دیگه جوانمو جویای نام و علم

arash_j13
04-09-2006, 00:20
سوال اولتون

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

توی سوال دوم هم یه آرایه از کارکتر ها تعریف شده که بهش مقدار اولیه اده شده ایم مقدار اولیه به صورت اعداد مبنای 16 هست

havva
04-09-2006, 14:59
;کارکتر تعریف شده چیه ؟؟؟؟

در مورد سوال یک خودم سورس رو می دونم دارم می خوام توضیح کوچولو بدین هر کدوم چی می کنن در واقع می خوام
کاکرد برنامه فقط اون قسمتش که مربوط به سوال منه رو شرح بدید ممنون

arash_j13
05-09-2006, 00:35
;کارکتر تعریف شده چیه ؟؟؟؟
منظورتون رو متوجه نشدم

کار اون کد هم خیلی ساده است توی پارمتر اول تابع main تعداد پامتر های خط فرمان وجود داره پارمتر اول(صفرم) همیشه نام و آدرس فایل هست که توی خط فرمان نوشته شده پس همیشه لا اقل یک پارامتر وجود داره حالا بررسی می کنیم اگه این تعداد یک بود یعنی هیچ پارامتر دیگه ای وارد نشده و نام برنامه خالی نوشته شده پس راهنما رو نشون می دیم در غیر این صورت بقیه برنامه اجرا می شه

havva
05-09-2006, 18:12
اقا نفهمیدم نفهمیدم نفهمیدم
تو کد زیر رروببین بعد به سوالام تو رو خدا ساده و یک کم مفصل شرح بده شرمندتم


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

به کد بالا نگاه کن شماره گذاشتم 3 تا از اون 3 تا مشکل دارم ببین
1- اون int argv نماینده ی چیه اون بالا ؟؟؟؟؟
اون طور که معلومه char * argc[] برای اسم فایل مورد نظره!!
2- Argv چه مقداری هایی رو می تونه به خودش بگیره که اون جا نوشته کوچکتر از 2 بود کمکی رو نشون بده در واقعا چطوری می شه که argv یه مقدار به خودش می گیره که 1 است یا غیره است
3- این 3 رو اصلا نفهمیدم چیه !!!!! چرا نوشته argc[1] مگه اون از ما اسم فایل رو نمی خواد این 1 دیگه چیه توی اونه ؟؟؟

someone
05-09-2006, 19:23
دوباره سلام.
فکر میکنم با یک مثال مشکل شما حل میشه. این برنامه رو بنویسید و کامپایل کنید. و فایل exe ی ایجاد شده رو در ریشه ی یکی از driveهاتون قرار بدید. مثلا در C.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا این طور برنامتون رو تست کنید.
از منوی start گزینه ی Run رو انتخاب کنید و این دستور رو تایپ کنید : cmd
حالا باید command.com باز شده باشه.
در خط فرمان این رو تایپ کنید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خروجی برنامه به شکل زیر هست:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حالا این دستور رو تایپ کنید:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
خروجی برنامه به این شکل در میآد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
به طور ساده به ازای هر Command ی که در ادامه ی test.exe مینویسید مقدار argv یکی زیاد میشه مثلا:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
باعث میشه مقدار argv برابر 4 بشه.
*argc[] هم مقدار این Command ها رو در خودش ذخیره میکنه. *argc[] یک آرایه دو بعدی هست.
مثلا اگه شما این دستور رو وارد کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مقدار argc[1]==test1 و argc[2] ==test2 قرار میگیره.در اینجا مقداره argv هم برابر 3 هست.

در مورد سئوال سوم شما بايد بگم اولين Commandی که برنامتون میگیره اسم یک فایل هست که اگه این فایل وجود نداشته باشه مقدار برگشتی تایع fopen = null ميشه.برنامه سعي ميكنه با اين تابع يك file رو در حالت read only باز كنه. طبق چيزهايي كه صحبتش رو كرديم مقدار [1]argc اسم file مورد نظر شما هست در ضمن مقدار argv=2 هست.
اميدوارم كمكتون كرده باشه.

havva
05-09-2006, 20:16
به خدا شرمنده خیلی قشنگ توضیح دادید نمی شه روش حرف زد ادم با ضریب هوشی زیر متوسط هم اینو می فهمه

یکی دکمه ی تشکر بذاره تا من از ایشون تشکر کنم

خیلی مخلصیم ممنون

havva
06-09-2006, 19:39
some one جان برام سوال بازم پیش اومد

اولش اینکه من نتوستم کدت و کامپایل کنم اینو نوشت
fatal error C1189: #error : "eh.h is only for C++!"

بعدش در مورد *argc[] این هواره دوبعدیه؟؟ ایا برای چیز هایی که باید سه ورودی بگیرن چی ؟؟؟

someone
06-09-2006, 20:08
دوباره سلام.
مفهوم يه آرايه دو بعدي اين نيست كه فقط ميتونه دو تا ورودي داشته باشه.
اين مثال رو نگاه كنيد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا آرايه ما اين مقادير رو در خودش داره:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اميدوارم متوجه شده باشيد.
در ضمن فكر كنم چون داريد از iostream و namespace اين header استفاده ميكنيد اين مشكل براتون پيش اومده احتمالا كامپايلر شما كامپايلر c هست نه كامپايلر ++c
اين تغييرات رو در برنامه بديد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

havva
06-09-2006, 20:52
کامپایلرم ویژال استادیو c++ است
مفهموم ارایه دوبعدی چیه یعنی هر ارایه ای که بیش از یه ارگومان بگیره اخه اینی که من خونده بود در کتاب دوبعدی این بود
char array [10][10] یعنی دو تا [] داشت

می بخشی من در کتاب خودنه بود وقتی اشاره گر به هر چی تعریف می کنم اگه اول بهش مقدار ندیدم منظورم اینجا char*argc[] است باید با تابع malloc() بهش فضا بدیم منظورش با چیزی که ما اینجا کردیم اخه متفاوته من اشنباه فهمیدم ایا منظورش رو ؟؟

someone
06-09-2006, 22:48
برنامه مشكلي نداره شايد از اين header به اين شكل استفاده ميكنيد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
كه شكل صحيحش اينه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ببينيد به طورخيلي ساده اين دو كد با هم فرقي ندارند(گرچه در واقع اين طور نيست)

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
كه هر دو dynamic array هستند.
باز به طور ساده تر اين دو كد با هم برابر هستند:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اميدوارم متوجه منظورم شده باشيد.
يك اشاره گر يا pointer يا * Operator به يك آدرس در حافظه اشاره ميكند كه حتما بايد مقدار اوليه داشته باشه
حداقل اينكه مقدارش بايد null باشه مگر در آرگومان يك تابع. وقتي از malloc استفاده ميكنيد در حقيقت
خودتون memory management رو به عهده ميگيرد و باعث ميشه كه OS يا سيستم عامل يك بلوك از حافظه به مقدار مورد نياز شما در اختيار شما قرار بده.اين فضا در Heap ايجاد ميشه نه Stack.
در ضمن ميشه يك pointer رو با malloc مقدار دهي كرد مثل كد زير:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
البته بايد چك كرد كه آيا فضاي خواسته شده به ch داده شده يا نه و بعد از استفاده بايد
حافظه ي ايجاد شده رو آزاد كرد:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اينها مفاهيم مهمي هستند و حقيقتا زياد ساده هم نيستند براي يادگيريشون زياد عجله نكنيد.

به نظرم شما زيادي عجله داريد كه برنامه نويسي رو ياد بگيريد.باز هم ميگم زياد عجله نكنيد چون اين مفاهيم بسيار مهم هستند و در برنامه هاي كوچيك خودشون رو نشون نميدن.

havva
07-09-2006, 14:41
گفتین بگم دوست
دوست سی من یه سوال جدا از از این سوال قبلیم اومد نخواستم دیگه تاپیک جدید بزنم این چطوریه که شما انگار برای چاپ در خروجی stdout انگار از این توابع این کاره استفاده نمیک نی نمی دونم می نویسی
"بسشبب" >> count

نفهمیدم زیاد چیه این چه روش چطوری باهاش کار می کنن ؟؟

Admiral
07-09-2006, 14:57
دقیقاً منظورتون رو متوجه نشدم چون خیلی اشتباه تایپی داشتین !

Stdout همون Standard Output هست یعنی مانیتور.

دستور cout برای نمایش متغیر ها و ثوابت در ++C بکار میره.


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

someone
07-09-2006, 15:47
پاسخ Admiral كامل هست من فقط اضافه كنم اگه يادتون باشه وقتي از printf استفاده ميكرديد
در آرگومان اول مشخص ميكرديد كه نوع خروجي شما چيه.
مثل كد زير:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در اينجا لازم نيست نوع داده خودتون رو تعريف كنيد وهمونطور كه Admiral گفتند به اين شكل استفاده ميشه :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همچنين با اضافه كردن >> ميتونيد چند نوع مختلف رو در خروجي نشون بديد.مثلا:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

MXBABAK
09-03-2007, 15:47
سلام بچه ها اميدوارم حالتون خوب باشه
من دانشجوي كامپيوتر هستم و استادمون يه سوال گفته كه من نوشتم و يه مشكل كوچيك و لي در حقيقت بزرگ دارم
استاد گفته يه برنامه اي بنويسيد با ++c كه دو تا عدد صد رقمي رو با هم ضرب كنه و من هم نوشتم فقط در موقع گرفتن عدد كه صد رقمي باشه هيچ متغيري ضرفيت اينو نداره واسه همين خواستم با آرايه تك تك عدد رو بگيرم و واسه همين از تابع Getch() استفاده كردم و متا سفانه خروجي كه مي ده كاراكتره و نمي شه اون رو ضرب يا تقسيم كرد واسه همين مي خواستم ببينم كسي هست بدونه كه تو سي چه تابعي است كه مي تونه كاراكتر رو سريع از صفحه كليد بگيره و به عدد تبديل كنه
ممنون

hamidreza_buddy
09-03-2007, 16:36
اون کاراکتری که برگدونده مبشه کد اسکی اون رقم هست. چون کدهای اسکی ارقام پشت سر هم هستن :
مثلاً (0 کد اسکیش 30. 1 کدش 31 و ... ) این مقادیر رو منهای 30 کن:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
توی c این دستور: '0' خودش کد اسکی 0 برمی پردونه و نیازی نیس که این شماره ها رو حفظ باشی

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
جدول کدهای ascii
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

MXBABAK
09-03-2007, 22:28
دمت گرم حميدرضا ممنون از لطفت