در اين بخش مي‌توانيد در مباحث مربوط به زبانهاي بر پايه C به بحث بپردازيد
Major

Major



نماد کاربر
پست ها

236

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

جمعه 14 مهر 1385 16:48

محل سکونت

تهران-اهواز

آرشيو سپاس: 3 مرتبه در 3 پست

چگونگي محاسبه زمان در سي پلاس پلاس

توسط shahram_sampad » دوشنبه 13 فروردین 1386 06:10

سلام دو ستان من یه کمکی نیاز دارم...

من یه برنامه باید بنویسم که خودش یه فایل (text) رو کپی کنه و زمان این کپی کردن رو محاسبه کنه... ممنون میشم اگه کمک کنید...آخع من تا حالا با توابع زمان کار نکردم.

در واقع یه چیزی تو مایه های تایمر باید باشه فکر کنم... یعنی از آغاز کپی کردن یک فایل شروع کنه و پس از  اتمام کپی کردن فایل زمان متوقف بشه و زمان محاسبه شده رو برگردونه...

منتظر کمک شما هستم...مرسی

Colonel II

Colonel II



no avatar
پست ها

90

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

پنج شنبه 9 شهریور 1385 21:15

آرشيو سپاس: 9 مرتبه در 8 پست

Re: چگونگي محاسبه زمان در سي پلاس پلاس

توسط athlon64x2 » دوشنبه 13 فروردین 1386 17:31

سلام دوست خوبم

تحت چه پلتفرم و سيستم عاملي و با کدام کمپايلر ميخواهيد کار کنيد ؟
وقتي ميفرماييد c++ دست پاسخ دهنده در حد ANSI C++ بسته ميشه . اگر دقيقتر سوال ميفرموديد راحت تر ميشد پاسخ داد اما من برحسب قرائن به دو حالت اشاره ميکنم

حالت اول: هدف شما ANSI C++ است . شما بايد از توابع time.h استفاده کنيد . حداکثر دقت شما clock tick هست . مثلا  فرکانس ساعت سيستم عامل داس 18 و ويندوز 1000 هست که ماکروي CLK_TCK اين مقدار رو برميگردونه و محاسبه زمان با تقسيم tick ساعت گذشته بر تيک در ثانيه بدست مياد. بنابراين اگر در داس يک فايل کوچک رو کپي کرديد به احتمال بسيار بسيار زياد زمان گذشته برابر با 0 رو خواهيد ديد که اشکال کد نيست . در مثال زير بجاي لوپ خالي تابع کپي فايل خودتون رو صدا بزنيد ولي همونطور که گفتم رزولوشن اين ساعت تحت داس خيلي کم هست.

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


حالت دوم: سوال قبلي در مورد C++ که ديروز در انجمن مطرح فرموديد مربوط به borland c++ 5.02 بود . با توجه به قدمت اين محصول فقط کمپايلر داس اون ارزش داره و با اين پيش فرض که از بورلندسي++ تحت داس استفاده ميکنيد ميتونيد از timeb استفاده کنيد که دقت تئوريک 1/1000 ثانيه داره و البته جزو ansi c++ نيست اما در اغلب کمپايلر ها مثل gcc و vc نيز در دسترس هست.

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


اميدوارم در حل مشکل کمک کننده باشه

ارادتمند
نعيمي

Major

Major



نماد کاربر
پست ها

236

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

جمعه 14 مهر 1385 16:48

محل سکونت

تهران-اهواز

آرشيو سپاس: 3 مرتبه در 3 پست

توسط shahram_sampad » سه شنبه 14 فروردین 1386 15:11

آقاي نعيمي عزيز  خيلي ممنون از کمک هايي که کرديد
من اين کد ها را با هون برنامه ي کپي کردن فايل text که گفتم run  کردم اما ...
کد اولي که نوشتيد همه ي زمان ها رو صفر نشون ميداد چه به صورت 1 مگ 1مگ کپي ميکردم چه 1کيلو 1کيلو وچه 1 بايت 1بايت  و ...
اما کد دوم کار کرد ولي يه چيزي واسم سواله و اون اينکه مثلا زمان کپي کردن اين فايل به صورت يک بيتي بايد بيش تر از زمان کپي کردن به صورتا کيلويي باشه و ... اما اين طور نشد و اين بي نظمي علاوه بر اين در ساير کپي هاي بالا نيز بود يعني 1 مگ و 2 بايتي و 4 بايتي و ... نسبت به هم...
و عجيب تر از همه انکه در کپي کردن فايل text سايز فايل نهايي گاهي بيشتر از سايز فايل اصلي بود به صورتي که حجم فايل نهايي کپي شده 2 گيگ ميشد در حاليکه فايل اصلي 1.5 گيگ بود...

ممنون ميشم باز هم راهنماييم کنيد

راستی همون طور که خودتون حدس زدید من با همون borland C++ 5.02  کار میکنم

Colonel II

Colonel II



no avatar
پست ها

90

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

پنج شنبه 9 شهریور 1385 21:15

آرشيو سپاس: 9 مرتبه در 8 پست

توسط athlon64x2 » سه شنبه 14 فروردین 1386 18:50

shahram_sampad نوشته است:آقاي نعيمي عزيز  خيلي ممنون از کمک هايي که کرديد


سلام دوست عزيز و خوبم . خواهش ميکنم شما لطف داريد اميدوارم واقعا در حد واژه کمک بوده باشه

من اين کد ها را با هون برنامه ي کپي کردن فايل text که گفتم run  کردم اما ...
کد اولي که نوشتيد همه ي زمان ها رو صفر نشون ميداد چه به صورت 1 مگ 1مگ کپي ميکردم چه 1کيلو 1کيلو وچه 1 بايت 1بايت  و ...


دوست خوبم در پست قبلي ذکر کرده بودم که به احتمال زياد زمان رو به اين روش صفر خواهيد ديد . اينطور نيست ؟ دلايل رو در همون پست ذکر کرده بودم . اصولا اين روش رو بخاطر دقت پايين توصيه نميکنم .

شما احتمالا از محيط ويندوز يک cmd باز ميکنيد و در اونجا کار ميکنيد. در اينصورت کاشه ديسک ويندوز فعاله و برحسب سايز رم کامپيوتر شما حتي فايل هاي تا 24 مگابايت هم مستقيما روي رم کپي ميشن و زمان عملا صفر ميشه . برنامه رو بصورت Debug پيش بريد و روي t1, t2 و d يک watch بگذاريد و برنامه رو قدم به قدم جلو بريد ميبينيد که درست کار ميکنه . در ضمن به سورس کد دقت کنيد عملا هيچ کار خاصي انجام نميده! داره مقدار بازگشتي از دو تابع رو قبل و بعد از يک کار از هم کم ميکنه کدي نيست عملا!
مشکل دوم از قدمت کمپايلر ناشي ميشه .کمپايلرهاي بورلند از روش اشتباهي براي تخمين زمان مکث استفاده ميکنند . در توربو پاسکال يک لوپ اجرا ميشه و عدد 1 بر زمان گذشته تقسيم ميشه که در پي سي هاي جديد زمان اين لوپ برابر صفر ميشه و ارور معروف Devide by zero در همون صدا زدن ابتداي برنامه رو داريد . بورلند سي++ هم از اين قاعده مستثني نيست و از روشي تقريبا مشابه در c0.obj بهره ميبره . با اين وجود اگر در داس بوت کنيد (نه از cmd) ميتونيد مقدار tick گذشته يعني متغير d رو تست کنيد (ديباگ قدم به قدم) البته در داس 1/18 ثانيه بيشتر دقت نداره. استفاده از VMWare براي شبيه سازي محيط داس بسيار توصيه ميشه و از اون بهتر  DOSBox هست که واقعا عاليست . توضيحات اين برنامه رو جناب Mahdi1944 در يک تاپيک بطور مفصل همراه با آدرس داونلود ارسال کرده اند که در فروم پيدا ميکنيد.

ترجيحا کمپايلر رو عوض کنيد وقت شما ارزشمند تر از اونه که درگير کشتي گرفتن باگ هاي کمپايلر بشيد .اگر قصدتون کار با بورلند سي است حتما borlandc++ 5.5 رو مدنظر داشته باشيد و توصيه من borland c++ builder هست که کمپايلر c++ و آخرين نسخه کتابخانه ها و تمپليت ها رو همراه داره . از اون بهتر کمپايلر معروف gcc از پروژه GNU هست که عالي است و يکي از پياده سازي هاي خوب ansic++ هست . در انجمن يکي ديگر از دوستان خوبمان نيز با مشکلات عدم سازگاري کمپايلر بورلند سي++ 5.02 مواجه شدند که ميتونيد مطالب تاپيک زير رو مشاهده کنيد . در يکي از پستهاي مياني ادرس سايت داونلود  نسخه پيش کمپايل شده براي داس  GCC رو نيز ذکر کردم . اين کمپايلر فعلا بهترين کمپايلر سي اوپن سورس هست و براي کمپايل کرنل لينوکس هم از همين کمپايلر استفاده ميشه .
http://www.centralclubs.com/viewtopic.p ... ight=79087

اما کد دوم کار کرد ولي يه چيزي واسم سواله و اون اينکه مثلا زمان کپي کردن اين فايل به صورت يک بيتي بايد بيش تر از زمان کپي کردن به صورتا کيلويي باشه و ... اما اين طور نشد و اين بي نظمي علاوه بر اين در ساير کپي هاي بالا نيز بود يعني 1 مگ و 2 بايتي و 4 بايتي و ... نسبت به هم...


نه دوست خوبم عجيب نيست . اين روش همونطور که در پست قبلي هم ذکر کردم رزولوشن تئوريک يک هزارم ثانيه داره که البته در عمل اصلا چنين نيست . در ضمن عملکرد کاشه ديسک رو هم فراموش نکنيد احتمالا شما روي ويندوز داريد برنامه رو تست ميکنيد و ممکنه به اين علت باشه . من روي vmware با اين مثال دوم مشکلي ندارم و گذشت زمان رو با دقت قابل قبولي درست محاسبه ميکنه و قاعدتا بايد در داس نيز چنين باشه . البته من پچ هاي bc5.02 رو هم نصب کردم ولي اين کمپايلر داراي باگ هاي شناخته شده در تمام موارد مربوط به زمان هست . مثالي ديگه که در پي سي هاي سريع امروزي نمود پيدا ميکنه روتينهاي random هست . اين روتينها هم جزو ansic++ هستند و بايد از استاندارد خاصي در رندم سازي مقادير خروجي پيروي کنند با اين وجود همانند روتين هاي کتابخانه time اين روتينها نيز همگي با خروجي اشتباه اجرا ميشن و يک ميليون بار هم اجراشون کنيد مقدار ثابتي احتمالا برابر با صفر دريافت خواهيد کرد و با تغيير seed و ... هم هيچ نتيجه اي نميگيريد چراکه تايمر زمان رو نميشمره.

و عجيب تر از همه انکه در کپي کردن فايل text سايز فايل نهايي گاهي بيشتر از سايز فايل اصلي بود به صورتي که حجم فايل نهايي کپي شده 2 گيگ ميشد در حاليکه فايل اصلي 1.5 گيگ بود...


نه دوست عزيز اين باگ هست . شما از چه روتيني براي کپي فايل استفاده ميکنيد ؟ ؟آيا تغييراتي به ديتاي خوانده شده ميديد بعد اونو مينويسيد يا مستقيما read->write ? سايز بافر رو چطور در نظر گرفتيد و ... ؟
اگر مايل هستيد روتين کپي خودتون رو ارسال کنيد تا در موردش صحبت کنيم ولي اين باگ هست مطمئن باشيد چرا که روتين هاي i/o در سي و سي++ طبق قرارداد به سيستم عامل زيرين ارسال ميشه و کدي براي پياده سازي اون در کتابخانه هاي سي وجود نداره .  دقت کنيد که حتما md5 فايل مبدا و مقصد بايد يکي بشه و بايد اينو با فايلهاي متفاوت و سايزهاي متفاوت تست کنيد تا از درست بودن روتين مطمئن بشيد .

ارادتمند
نعيمي

Major

Major



نماد کاربر
پست ها

236

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

جمعه 14 مهر 1385 16:48

محل سکونت

تهران-اهواز

آرشيو سپاس: 3 مرتبه در 3 پست

توسط shahram_sampad » سه شنبه 14 فروردین 1386 21:39

باز هم ممنون جناب نعيمي عزيز...آقا واقعا شما استاد هستيد... خداييش تا حالا فکر نميکردم برنامه نويس هايي با اين همه مهارت و هوش و اطلاعات توي ايران هم باشه... واقعا حتي اگر فرصت جواب دادان به سوال هاي دوستان رو نداشتيد باز هم (ببخشيد که محاوره اي ميگم)با شما و اين همه اطلاعاتتون خيلي حال کردم و حتي معذرت ميخوام که گاهي به خاطر ضعف اطلاعاتم نميتونم برخي از  چيزهايي رو که مينويسيد بفهمم...

کدم رو در زير قرار ميدم البته معذرت ميخوام که خيلي از کدهاش شبيه همون چيزهاييه که از شما پرسيدم...
کد: انتخاب همه
 لينکها براي کاربران مهمان قابل دسترسي نيست، براي مشاهده ي لينکها لطفا ثبت نام کرده و وارد شويد 

Major

Major



نماد کاربر
پست ها

236

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

جمعه 14 مهر 1385 16:48

محل سکونت

تهران-اهواز

آرشيو سپاس: 3 مرتبه در 3 پست

توسط shahram_sampad » چهارشنبه 15 فروردین 1386 22:08

من منتظرم...
عمریست که از حضور او جا ماندیم/ در غربت سرد خویش تنها ماندیم/ او منتظر ماست که ما برگردیم/ ماییم که در غیبت کبرا ماندیم

Colonel II

Colonel II



no avatar
پست ها

90

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

پنج شنبه 9 شهریور 1385 21:15

آرشيو سپاس: 9 مرتبه در 8 پست

توسط athlon64x2 » پنج شنبه 16 فروردین 1386 04:38

سلام دوست خوب و بسيار عزيزم

شرمنده هستم . ببخشيد من ديروز به دليل مسائل و مشکلاتي اصلا موفق به بازديد از سايت نشدم
از لطف و محبتي که نسبت به من ابراز نموديد بي اندازه سپاسگزارم و البته عبارات پر محبتتون رو از زبان يک دوست ميخونم چرا که اصلا خودم رو نه در اين حد ميدونم و نه حتي لايق چنين عباراتي . اگر واقعا موفق به کمک به خوبان خوبي چون شما شده باشم بي اندازه منو خوشحال ميکنه و ما به ازاي آن دوستاني چون شما پيدا ميکنم که ارزشمند ترين هستيد . در ضمن بين ما دانشمنداني هستند که با فروتني علمشون رو در اختيار همه گذاشته و ميگذارند و زبان از تحسين اونها عاجزه . جناب mahdi1944 خودمون يکي از حرفه اي ترين و مسلط ترين اتوريته هاي برنامه هاي سيمبيان هستند و از اونجا که سالهاست پيگير مطالب اين زمينه هستم با اطمينان ميگم اولين ايراني هستند که برنامه هاي مفيد رو انتخاب و تهيه ميکردند و با کيفيتي بسيار بالاتر از فروم هاي خارجي براي استفاده کاربر ايراني قابل رجيستر ميکردند و نام ايشون ضامن کيفيت و سلامت برنامه بود و هست و کدام گوشي رو پيدا ميکرديد که چندين برنامه از کارهاي ايشون رو نداشته باشه و بزرگترين سهم رو در گسترش فرهنگ نرم افزارهاي گوشي هوشمند دارند . در حضور اين بزرگان که اساتيد واقعي هستند آدم گناه ميکه اگر اين کوچک بضاعتش رو در اختيار سايرين قرار نده . دوستان علاقمند و مطلعي  چون شما هم در آينده به خيل برنامه نويسان بسيار خوب ايراني ميپيونديد . بازهم از نظر لطف و محبت شما سپاسگزاري ميکنم و بدون هيچ تعارفي ميگم که اين شما هستيد که استاد من هستيد که منو به فکر و يادگيري واميداريد . از شما ممنونم و اين خوباني چون شما هستيد که با به ميون کشوندن بحث هاي مفيد زمينه به اشتراک گذاشتن دانسته هار رو فراهم مياريد.

اما در مورد برنامه . نکاتي که به نظر ميرسه رو در دو بخش کلي و اختصاصي خدمتتون تقديم ميکنم.

نکات کلي

برنامه نويسي (بخصوص در مورد زبان سي که دو استاندارد داره) با دو نگرش به الگوريتم انجام ميشه . يکي اينکه به کل برنامه يکجا نگاه کنيم و از خودمون بپرسيم چه کاري انجام ميده و اين کار رو به قطعات کوچکتر تقسيم کنيم. روش دوم پيدا کردن اشيا انتزاعي است که در انجام اين کار با همديگه همکاري ميکنن ولي هرکدوم ماهيت مستقل خودشون رو دارن . ممکنه از هر شيي يک يا چندتا وجود داشته باشه و ممکنه يک شي بعنوان شي اصلي عمل کنه يا اينکه مورد استفاده اشيا ديگه قرار بگيره .
مسلما شما با اين مباني بهتر از من آشنايي داريد صرفا براي دوستاني که علاقمند هستند اين مطلب رو بصورت يک مثال ساده توضيح ميدم. فرض کنيد ميخواهيد فرم وير (نرم افزار داخلي مديريت عملکرد و ورودي-خروجي يک سخت افزار)  يک توستر هوشمند رو بنويسيد . به دو شکل ميشه به قضيه نگاه کرد.
1. درجه برشتگي و نان بعنوان ورودي برنامه هستند - نان رو به داخل ميکشيم -  برحسب درجه برشتگي زمان رو محاسبه ميکنيم - المنت ها رو روشن ميکنيم - تايمر رو صدا ميزنيم تا n ثانيه مکث کنه - نان رو بيرون ميديم .
2. توستر ما تشکيل شده از اشيا - آنچه تست ميشه - سلکتور (يک درجه داره و يک فاکتور تصحيح داره و متدي که برحسب ايندو زمان رو به بصورت يک واحد قراردادي پذيرفته شده مثل ميلي ثانيه حساب ميکنه) -  مکانيسم حرکت (دو متد داره يکي لود ميکنه يکي unload) - تايمر (يک مقدار اوليه بر حسب ميلي ثانيه و يک event که در پايان زمان صدا زده ميشه) . حالا از تست شدني (1 عدد = نان) - سلکتور (1 عدد = درجه برشتگي) - مکانيسم حرکت (1 عدد elevator نان) - المنت (2 عدد) - تايمر (1 عدد) . اين اشيا کاربرد کلي دارند مثلا همين تايمر در ماکرو فر و همين مکانيسم لود در سي دي درايو هم قابل استفاده است .
به روش اول برنامه نويسي modular ميگن . توابع مرتبط در يک ماژول قرار ميگيرن (همون obj خودمون که از کمپايل c بدست مياد) و متغير هاي گلوبال هر ماژول براي ماژول ديگه external هستن . اين روش C است  و فقط و فقط به درد برنامه هايي که کار کوچکي انجام ميدن و ديدن کار بصورت 3 يا 4 "کار" متوالي اسونتر از "اشيائ" مرتبط است استفاده ميشه .روش دوم برنامه نويسي object oriented هست که در c++ مورد استفاده است .
حالا برنامه مثال خودتون رو ببينيد . اگر هدفتون نوشتن يک برنامه مثل copy داس باشه روش قابل قبولي است اما با توجه به سوالات خوب شما در انجمن حدس ميزنم برنامه نهايي عملکردي به مراتب بيشتر داره . اگر چنين هست ميتونيد در همين مثال اشيايي از جنس فايل (دو عدد يکي ورودي يکي خروجي) - ساعت (يک عدد براي نمايش زمان بصورت کورنومتر) ببينيد .

نکات اختصاصي

1. اول سوال اصلي شما يعني باگ برنامه . خيلي واضح دو تا است . شما از متدهاي غير مشابهي براي خواندن و نوشتن اطلاعات استفاده کرديد . تابع get در istream يک تابع نيمه فرمت شده است read غير فرمت شده است و اوپراتورهاي << و >> در عوض کاملا فرمت شده . در واقع آن چيزي که ميخونيد رو در فايل نمينويسيد و اگر از >> يا get استفاده کرده بوديد که حتي همه فايل رو هم نميخونديد!
سوال من اينجاست. در اين توابع که فعلا کاري با اطلاعات خوانده شده انجام نداديد . پس چه کاري به text بودن و نبودن فايل داريد ؟ ios به EOF در فايل text و binary به دو شکل متفاوت نگاه ميکنه و در کنار تفاوت در توابع داراي فرمت اين مهمترين فرقشونه. در واقع وقتي هدفتون کپي ورودي به خروجي است مطمئن ترين و بي خطر ترين روش کپي باينري است . اين وسط ميشه ديتاي باينري خونده شده رو هم به string لود يا cast کرد هرکدوم مايل باشيد و روش دخل و تصرف کرد. پس باگها يکي (آنکه شما ديديد) عدم تقارن دستورات ورودي خروجي و دومي (اگر فايل باينري کپي کنيد) استفاده از مود text در ios هست. توابع قرينه در ios چنين هستند
read - write
get - put
>> - << که البته اوپراتور overload شده است و عملکردش با skipws در هر instance هم تغيير ميکنه اما بطور پيش فرض قرينه هستند .

2. معيار پايان کپي: براي اينکار اگر stream در مود text باشه اصلا eof معيار خوبي نيست . وجود يک کاراکتر eof در وسط فايل text باعث ميشه که اين تابع جواب true برگردونه و بقيه فايل سوت بشه!

3. error handling:  مثلا فرض کنيد فايل ورودي يا خروجي روي يک کول ديسک هست و کاربر وسط کار اين ديسک رو از usb در مياره! البته از اونجا که داريد در داس کار ميکنيد ميشه فلاپي رو مثال زد يا اصلا ديسک مقصد پر شد و جا نداشت! اونوقت برنامه عملکرد غير قابل پيش بيني پيدا ميکنه . توجه کنيد که بيسيک نيست که پيغام خطاي داخلي داشته باشه که اگر شما handle نکنيد نشونش بده (يکي از دلايل بزرگ محبوبيت بيسيک) .

دوست خوبم الان ساعت 4 و نيم بامداد هست و به سختي مونيتور رو ميبينم . قول ميدم کد شما رو اول وقت تصحيح و ارسال کنم . باز هم عذر ميخوام که منتظر مونديد .

ارادتمند شما
نعيمي


Mahdi1944:
با سلام خدمت استاد و سرور گرامي جناب دکتر نعيمي
بنده هميشه مورد لطف شما بودم و در اين مورد هميشه در اينکه چه جوابي شايسته‌ي شماست عاجز بودم  :o
در هر صورت شما از اساتيد مسلم در برنامه نوبسي و علوم حوزه‌ي طراحي نرم افزار هستيد که تا به حال ديدم و در اين مورد کوچکترين ترديدي ندارم، هرچند شما به خاطر فروتني که قطعا ناشي از سطح علمي شماست اين موضوع رو انکار نموديد
بنده هرگز خودم رو لايق القابي همچون استاد و دانشمند نميدونم، اين واژه‌ي بزرگ و مقدسي هست که لايق هر فردي (همچون بنده) نيست
فقط ميتونم اين رو عرض کنم که حضور شما در انجمن يکي از برزگترين افتخارات مرکز انجمنهاي تخصصي و آشنايي با شما براي بنده افتخاري بزرگتر هست
براي منحرف نشدن تاپيک اين متن رو در پايان پست اضافه کردم
هر کجا هستيد در پناه حق، پيروز و سرفراز باشيد  :razz:

Major

Major



نماد کاربر
پست ها

236

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

جمعه 14 مهر 1385 16:48

محل سکونت

تهران-اهواز

آرشيو سپاس: 3 مرتبه در 3 پست

توسط shahram_sampad » پنج شنبه 16 فروردین 1386 09:30

آقاي نعيمي متوجه يک اشتباه ديگر در کدم شدم و آن اينکه در هر تابع هنگام نوشتن در فايل خروجي يک endl اضافي گذاشته ام که باعث ميشود حجم فايل به مقدار زيادي اضافه شود  اما باز حجم فايل نهايي ازفايل اوليه بيشتر بود...؟؟؟؟؟؟؟؟

شما تابع read (,) را که به من مغرفي کرديد و من در کدم استفاده کردم تابعي 2 آرگوماني است اما من اين تابع را در help  برلند پيدا نکردم  و به اين خاطر نميدانم تابع write() متناظر آن چگونه است؟؟؟


ممنون ميشم اگر کدم را تصحيح کنيد و باز هم مثل هميشه جواب سوالم را بدهيد...


مرسي
عمریست که از حضور او جا ماندیم/ در غربت سرد خویش تنها ماندیم/ او منتظر ماست که ما برگردیم/ ماییم که در غیبت کبرا ماندیم

Colonel II

Colonel II



no avatar
پست ها

90

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

پنج شنبه 9 شهریور 1385 21:15

آرشيو سپاس: 9 مرتبه در 8 پست

توسط athlon64x2 » جمعه 17 فروردین 1386 06:03

سلام خدمت دوستان خوب و گرامي

دوست و سرور دانشمندم جناب mahdi1944
اين نهايت لطف و بزرگواري شما است . من در مورد شما هيچ اغراق نکردم و هيچ مدرکي بهتر از همين سايت و دوستاني که گرد هم آورديد نيست . بدون هيچ تعارفي اين بهترين انجمن فارسي زبانان از لحاظ مطالب ارائه شده و جو دوستي و احترام متقابل بين اعضا و احترام متقابل بين يکديگر و مديران گرامي سايت هست . دوستاني که با شناخت از شما گرد هسته اوليه جمع شدند و محفلي يگانه پديد آمد. من کوچکترين عضو اين جمع هستم و اين حضور مايه فخر و مباهات من است و دوستي و آشنايي با شما افتخاري بس بزرگتر . از شما و ساير خوبان اين جمع بسيار آموختم و هميشه ممنون و سپاسگزار شما هستم و خواهم بود. براي شما آرزوي سرافرازي هميشگي دارم .

دوست عزيزم shahram_sampad

بله دوست عزيز همينطوره و اون endl هم کل فايل خروجي رو متفاوت از ورودي ميکنه . ببخشيد من اين آيتم رو نديدم چون متاسفانه ديشب (يا بهتر بگم صبح) بدليل ذيق وقت فرصت تست کد رو اصلا پيدا نکردم .اول پاسخ سوال شما بعد کد مثال.

تابع write همونطور که گفتم قرينه read است . مثل read دو آرگومان دارد. اولي آدرس بافر و دومي تعداد بايتي که بايد به خروجي ارسال شود . در مثالهاي زير از زوج read/write استفاده شده و ميتونيد نحوه استفاده ر مشاهده کنيد.

من کد تصحيح شده شما رو در دو حالت ارسال ميکنم. در هردو حالت مطالبي که در پست قبلي در مورد مديريت خطا و ... نوشتم رو لحاظ کردم . حالت اول ماژولار و دومي شيي گرا است.
حالت اول: به شرطي که هدف شما صرفا نوشتن يک برنامه براي کپي يک فايل text باشد . در اينصورت ميشه از ساختار ماژولار استفاده کرد . اين روتين باينري بلوک کپي است من سايز بافر رو 64 کيلوبايت گرفتم که مشابه dos copy هست ميتونيد هرچقدر که مايليد اختيار کنيد. اين کد در borland c++5.02 هم جواب ميده

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



حالت دوم: ااگر عملکرد برنامه شما بيش از صرفا يک copy است بهتره از ساختار oop استفاده کنيد . در اين روش کلاسي متناسب با نيازها ميسازيم و در سراسر برنامه مورد استفاده قرار ميديم . تو اين مثال براي اين کلاس تابع استاتيک Copy و همينطور متدهاي Open و Close رو در نظر گرفتم بعلاوه ميتونيد از بقيه متدهاي هاي fstream هم استفاده کنيد و چه بهتر که متناسب با نياز متدهاي خودتون رو هم اضافه کنيد . به نظر من اينکه fstream با دادن نام فايل در ctor فايل رو open ميکنه يک عيب کوچک طراحي است که کلاس زير از اين نظر به نظر خودم رفتار بهتري داره  البته شما هر شکلي که راحت تر هستيد تغييرش بدين و استفاده کنيد . براي اجرا اين ها رو بصورت 3 فايل مجزا ذخيره کنيد. نام فايل رو اول فايل نوشتم. متاسفانه بورلند سي++ 5.02 نميتونه اين کد رو کمپايل کنه و براي اينکار بايد bc++5.5 از استفاده کنيد.


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



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


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


در ضمن اگر در حين کپي نياز به کار روي استريم به شکل string رو داشتيد دو راه حل داريد.
1. از تابع string.assign(buffer) استفاده کنيد
2. از istrstream استفاده کنيد
هرکدوم مزايا و معايبي دارند اما با توجه به توابع مورد نيازي که در سوالات قبلي نام برديد روش شماره 1 رو پيشنهاد ميکنم .
اميدوارم در حل مشکل کمک کننده باشه

ارادتمند
نعيمي
آخرين ويرايش توسط athlon64x2 on يکشنبه 19 فروردین 1386 02:19, ويرايش شده در 2.

Major

Major



نماد کاربر
پست ها

236

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

جمعه 14 مهر 1385 16:48

محل سکونت

تهران-اهواز

آرشيو سپاس: 3 مرتبه در 3 پست

توسط shahram_sampad » شنبه 18 فروردین 1386 13:37

سلام.gnu چه طور نصب میشه؟

من download کردم اما ...
عمریست که از حضور او جا ماندیم/ در غربت سرد خویش تنها ماندیم/ او منتظر ماست که ما برگردیم/ ماییم که در غیبت کبرا ماندیم

Colonel II

Colonel II



no avatar
پست ها

90

تشکر کرده: 0 مرتبه
تشکر شده: 0 مرتبه
تاريخ عضويت

پنج شنبه 9 شهریور 1385 21:15

آرشيو سپاس: 9 مرتبه در 8 پست

توسط athlon64x2 » يکشنبه 19 فروردین 1386 01:52

shahram_sampad نوشته است:سلام.gnu چه طور نصب میشه؟

من download کردم اما ...


سلام دوست خوبم
متاسفانه منظورتون رو دقيقا متوجه نميشم .

GNU پروژه اي است که قراره يک سيستم عامل کامل با کليه ابزار همراه اون رو بصورت open source توليد کنه که البته هنوز به پايان نرسيده و فعلا از لينوکس بعنوان سيستم عامل استفاده ميشه ولي تعداد زيادي ابزار خوب براش نوشته شده که بعضا به سيستم عامل هاي ديگه هم پورت شدن . احتمالا منظور شما کمپايلر gcc است که جزيي از پروژه gnu است.

پکيج DJGPP که تنها نسخه از کمپايلر gcc هست که exe تحت داس توليد ميکنه البته برنامه هاي توليد شده اون تحت dpmi در داس اجرا ميشن . در مورد اين پکيج قبلا در يکي ديگه از تاپيک ها نوشته بودم که آدرس اونو در بالا خدمتتون معرفي کردم . اين پکيج علاوه بر کمپايلر و کليه هدرها و کتابخانه هاي لازم منجمله stl يک محيط IDE مشابه بورلند سي++داره به نام Rhide  که کار ديباگ رو راحت ميکنه.
http://www.delorie.com/djgpp/zip-picker.html

a. براي دريافت (اگر ميخواهيد مطمئن شيد که کامل داونلود کردين) آدرس بالا رو ببينيد . از گزينه ها C++ compiler  و Rhide environment و سيستم عامل DOS انتخاب کنيد . راهنما و .. هم ميتونيد بگيريد .
b. چند فايل zip خواهيد داشت . همه رو در يک فولدر  و با حفظ ساختار باز کنيد اين خيلي مهمه . در ضمن آدرسي نزديک ريشه انتخاب کنيد چون از long file name پشتيباني نميکنه مثلا (ممکنه ورژن فايلهاي شما جديدتر باشه صرفا بعنوان مثال هست)  
c. اگر در ويندوز هستيد يک cmd باز کنيد bin\setdjgpp.bat رو اجرا کنيد و سپس  .rhide.exe .در اونجا مشابه بورلند يک پروژه باز کنيد و فايلها رو بهش add کنيد (با ins) و پروژه رو کمپايل کنيد . اگر هم دوست داريد ميتونيد فايل رو بطور دستي در نوت پد تايپ کنيد و سپس کمپايل کنيد . در ضمن يادتون باشه که پسوند فايل cpp باشه نه CPP يا چيز ديگه . gcc به بزرگ و کوچک بودن حروف حساسه و اين شايع ترين مشکلي است که  ميبينم همکاران با اون برخورد ميکنن و سورسشون کمپايل نميشه .
gcc -o myfile.cpp myfile.exe

در ضمن توجه کنيد که سورس کدهايي که براساس ansic++ نگاشته شده اند بدون تغيير در gcc کمپايل ميشوند براي بقيه موارد بايد تغييرات کوچکي بدهيد . به عنوان مثال کدهاي قبلي که براي نسخه 5 بورلند سي هستند (5.02 يا 5.5) نياز ب اصلاحات کمي دارند.

در ضمن نگاهي اجمالي به فايل  x:\DJGPP\FAQ\djgppfaq.html  پاسخگوي اغلب سوالات شماست . در ضمن کليه زيپ فايلها نيز حاوي راهنما در مورد پکيج مربوطه هستند.

ارادتمند
نعيمي


 


  • موضوعات مشابه
    پاسخ ها
    بازديدها
    آخرين پست

چه کسي حاضر است ؟

کاربران حاضر در اين انجمن: بدون كاربران آنلاين و 1 مهمان