ايران ويج

نسخه‌ی کامل: میشه اینتجر رو بولین در نظر گرفت
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام.
2 سوال ساده ولی اصولی و پایه ای دارم.
حتما میدونید که در ویبی 0 فالسه و غیر 0 ترو. من هنگام کدنویسی اگر بخوام یه اینتجر رو تو یه شرط به کار ببرم میگم مثلا if a then در حالی که a اینتجره نه بولین. از یکی شنیدم این روش کدنویسی اشتباهه. میگفت سیستم عامل باید بیاد پشت پرده این اینتجر رو به بولین تبدیل کنه و مقایسه رو انجام بده و میگفت به همین دلیل ممکنه رو بعضی سخت افزار ها برنامه با مشکل روبرو شه. میگفت طریقه صحیح نوشتن کد اینه if a <> 0 then
مثلا چنین کدی اشکال داره؟
if Not a Then به جای if a=0 then در حالی که a اینتجر یا لانگه.
حالا 2 تا سوال دارم.
اول اینکه اون شخص درست میگه یا نه منظورم اینه که ممکنه با تغییر سخت افزار برنامه جواب نده.
دوم این که به نظر شما کدوم روش کد نویسی حرفه ای تر و صحیح تر است.
سلام.
کسی جوابشو نمیدونه؟
دوست من سلام

صحبتهای اون شخص تا حد زیادی درسته ! VB در جایی مثل if a then میاد و متغیر a رو به Boolean تبدیل میکنه و طبق گفته مایکروسافت این تبدیل نوع ( و همچنین برعکسش ) با دقت انجام نخواهد شد چراکه بر خلاف تصور خیلی ها boolen یک نوع داده عددی نیست  . البته بگم که عمل پشت پرده رو کامپایلر VB انجام میده نه سیستم عامل . در واقع در تمام کامپایلر ها دو نوع تبدیل نوع یا coversion وجود داره :
1- implicit یا درونی که توسط خود کامپایلر انجام میشه و نمونه اش هم همین سوال شماست .  
2-explicit یا دستی که برنامه نویس باید بیاد و مشخص بکنه که چه تبدیل نوعی انجام باید بشه مثلا استفاده از توابع val یا str . به عنوان مثال کامپایلر متغیر string رو به عدد بصورت درونی تبدیل نوع نمی کنه و شما باید با کمک توابع تبدیل نوع مثل val اونها رو انجام بدی .

این گفته که اجرای برنامه میتونه رو سخت افزار های مختلف نتایج مختلف داشته باشه درست نیست چون کد ماشینی که تولید میشه یکسانه و تمام مثلا کامپیوتر های IBM روشهای مشابهی برای اجرا برنامه و  ذخیره انواع داده دارند . این مشکل فقط میتونه در کتابخونه های مختلف مشکل بوجود بیاره . مثلا برنامه ای رو شما توی VB 6 نوشتی و وقتی همون رو به VB.Net تبدیل می کنی بعلتی که Net. روشهای متفاوتی رو برای تبدیل بکار میگیره ، میتونه نتایح مختلفی رو از خودش نشون بده . مایکروسافت هم در این باره می گه :
keep in mind that the .NET Framework conversion methods do not always produce the same results as the Visual Basic conversion keywords. This is because the Visual Basic conversion retains behavior compatible with previous versions

... این نکته رو بخاطر داشته باشید که تبدیل های .NET Framework همیشه نتایج مشابهی رو مانند توابع تبدیل نوع VB ایجاد نمی کنند . این به این علت هست که توابع تبدیل نوع VB سعی می کنند رفتاری داشته باشند که با نسخه های قدیمی مطابقت کنه .

http://msdn2.microsoft.com/en-us/library/wts33hb3.aspx
سلام.
ممنون از توضیحاتت.
من که تا حالا در استفاده از این روش کدنویسی با مشکل روبرو نشده ام. البته به NET. تبدیل نکردم و فقط خود ویبی با این روش خوب جواب داده.
شما فرمودید این تبدیل نوع با دقت انجام نخواهد شد. پس چرا تا به حای برای من مشکلی پیش نیومده. اگه دقتش بالا نیست 1 بارم که شده باید به مشکل بر بخورم.
سلام
خوب هستيد
ببنيد تبديلات دقيق نيستند يعني اينكه توي تبديل پيش فرض ممكنه  مشكلي بوجود بيايد . در حالت شما مشكلي ايجاد نميشه ( منظورم وي بي 6 ) چون با استفاده از تابع varbool دقيقا مقدار هاي غير از صفر به يك و مقادير كه فقط صفر هستندبه صفر تبديل ميشه
و درنتيجه مشكلي بوجود نميايد
ولي فرض كنيد شما يك عدد لانگ رو توي متغير اينتيجر بريزيد اگر اين عدد از محدوده اينتيجر يعني -32767  تا 32769 ( اگر مقادير بازه اينتيجر درست يادم مونده باشه )  خارج باشه ممكنه كه عدد به درستي تبديل نشه

منظور مايكروسافت اين نوع از تبديلات داخلي بودند .

اميدوارم كمك كنه
سلام.
ممنون از توضیحاتتون.
برای اطمینان میپرسم.
پس اگه a اینتجر باشه و من به جای If a <> 0 then بنویسم if a then و به جای if a =0 then بنویسم if Not a then مشکلی به وجود نمیاد؟
یه سوال دیگه حالا کدوم روش حرفه ای تر و اصولی تره؟
مشکلی به وجود نمی آد !
ولی حرفه ای تر اینه که خودت تبدیلات رو انجام بدی و کدت رو دقیق بنویسی
که کامپایلر نیاد و خودش تبدیلات رو انجام بده
سلام.
ممنون خسرو جان.
ممنون از همه دوستان.
فکر نمیکنیم کامپایلر ویبی برای تبدیل بیاد و کل اینتیجر را بخونه ... و در دستوری مثل if a then - جایی که a یک عدد هست فقط بیت اول خوانده میشود و به جای شرط قرار میگیرد .
حال شما تصور کنین که برای if a=0 عدد صفر با a باید مقایسه شود و جواب آن به دست بیاید و در جای شرط جایگذاری شود ...

به نظر من if a then هم شکیلتر هست و هم سرعت بالاتری دارد ...
دوستان اگر حوصله دارن میتونن یک برنامه بنویسن تا ببینن سرعت کدوم نوع دستور در شرایط یکسان بالاتر است ...

نقل قول: فکر نمیکنیم کامپایلر ویبی برای تبدیل بیاد و کل اینتیجر را بخونه ... و در دستوری مثل if a then - جایی که a یک عدد هست فقط بیت اول خوانده میشود و به جای شرط قرار میگیرد .
حال شما تصور کنین که برای if a=0 عدد صفر با a باید مقایسه شود و جواب آن به دست بیاید و در جای شرط جایگذاری شود ...

به نظر من if a then هم شکیلتر هست و هم سرعت بالاتری دارد ...
دوستان اگر حوصله دارن میتونن یک برنامه بنویسن تا ببینن سرعت کدوم نوع دستور در شرایط یکسان بالاتر است ...

بهترین راه حل اینه که یه فایل اجرایی واسه جفتشون بسازید و بعدش با debugger سورس اسمبلی اونو بخونیم . اونوقته که بهتر میفهمیم که کامپایلر وی بی چه میکنه !

نقل قول: بهترین راه حل اینه که یه فایل اجرایی واسه جفتشون بسازید و بعدش با debugger سورس اسمبلی اونو بخونیم . اونوقته که بهتر میفهمیم که کامپایلر وی بی چه میکنه !
if Not a then
[تصویر:  attachment.php?aid=328]
if a=0 then
[تصویر:  attachment.php?aid=329]
صفحه‌ها: 1 2