سلام دوست خوب و بسيار عزيزم
شرمنده هستم . ببخشيد من ديروز به دليل مسائل و مشکلاتي اصلا موفق به بازديد از سايت نشدم
از لطف و محبتي که نسبت به من ابراز نموديد بي اندازه سپاسگزارم و البته عبارات پر محبتتون رو از زبان يک دوست ميخونم چرا که اصلا خودم رو نه در اين حد ميدونم و نه حتي لايق چنين عباراتي . اگر واقعا موفق به کمک به خوبان خوبي چون شما شده باشم بي اندازه منو خوشحال ميکنه و ما به ازاي آن دوستاني چون شما پيدا ميکنم که ارزشمند ترين هستيد . در ضمن بين ما دانشمنداني هستند که با فروتني علمشون رو در اختيار همه گذاشته و ميگذارند و زبان از تحسين اونها عاجزه . جناب 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:
با سلام خدمت استاد و سرور گرامي جناب دکتر نعيمي
بنده هميشه مورد لطف شما بودم و در اين مورد هميشه در اينکه چه جوابي شايستهي شماست عاجز بودم
در هر صورت شما از اساتيد مسلم در برنامه نوبسي و علوم حوزهي طراحي نرم افزار هستيد که تا به حال ديدم و در اين مورد کوچکترين ترديدي ندارم، هرچند شما به خاطر فروتني که قطعا ناشي از سطح علمي شماست اين موضوع رو انکار نموديد
بنده هرگز خودم رو لايق القابي همچون استاد و دانشمند نميدونم، اين واژهي بزرگ و مقدسي هست که لايق هر فردي (همچون بنده) نيست
فقط ميتونم اين رو عرض کنم که حضور شما در انجمن يکي از برزگترين افتخارات مرکز انجمنهاي تخصصي و آشنايي با شما براي بنده افتخاري بزرگتر هست
براي منحرف نشدن تاپيک اين متن رو در پايان پست اضافه کردم
هر کجا هستيد در پناه حق، پيروز و سرفراز باشيد