مقدمه
یکی از اشتباهات رایج در برنامه نویسی با کامپایلر بسکام استفاده از متغیرهای متنوع در محاسبات ریاضی است. در زبانهای استاندارد مثل C معمولا میتوان متغیرهای مختلف را در یکدیگر ضرب و تقسیم کرد و نتیجه در سمت چپ معادله جایگزین میشود:
1 |
A = B / C |
به طور مثال در قطعه کد بالا ابتدا محتوای B بر C تقسیم شده و در صورتی که جواب در متغیر A قابل ذخیرهسازی باشد و بیشتر از ظرفیت آن نباشد بدرستی در A ذخیره میشود.
ایراد Bascom
اما در بسکام قضیه به همین سادگی نیست، قطعه کد زیر را در نظر بگیرید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Dim B As Byte Dim W As Word Dim L As Long Dim Dw As Dword L = 150000 B = 100 W = L / B Dw = L / B Print "W= " ; W Print "Dw= " ; Dw End |
در این کد متغیر B از نوع Byte و 1 بایتی است (بدون علامت)، متغیر W از نوع Word و 2 بایتی است (بدون علامت)، متغیر L از نوع Long و 4 بایتی است (علامتدار)، متغیر DW هم از نوع DWord یا Double Word و 4 است (شبیه Long ولی بدون علامت)، در این مثال با علامتدار یا بدون علامت بودن زیاد کار نداریم فقط به ظرفیت متغیرها توجه کنید.
در مثال بالا ابتدا در خط
1 |
W = L / B |
عدد 150000 را بر 100 تقسیم کردهایم و پاسخ را در متغیر W قرار دادهایم، حاصل 1500 می شود که براحتی در متغیر دوبایتی بدون علامت W (با گنجایش 65535) قابل ذخیرهسازی است اما حاصل محاسبات بسکام 189 میشود! احتمالا بسکام موقع عملیات تقسیم وقتی L چهاربایتی را بر B دوبایتی تقسیم کرد متوجه نمیشود که حاصل یک عدد دو بایتی شده و حاصل را نیز 4 بایتی در نظر میگیرد و بدرستی در W ذخیره نمیکند.
برای جلوگیری از وقوع چنین مشکلاتی در برنامه نویسی با کامپایلر بسکام همانطوریکه قبلا در مقاله AVR نویزپذیر نیست اشاره کردیم حتماً در سمت چپ معادلات از بزرگترین متغیری استفاده کنید که سمت راست هم استفاده شده، مثلا اگر در سمت راست معادله Long داریم جواب را هم در Long قرار دهید هرچند مطمئنید که داخل آن عدد کمتری قرار خواهد گرفت:
1 |
DW = L / B |
این مشکل فقط در محاسبات اتفاق میافتد، (نسخه جاری بسکام 2085 است و ممکن است در نسخههای بعدی رفع شود). جالب اینجاست که در غیر محاسبات این مشکل وجود ندارد، مثلا اگر بعد از محاسبات بالا قطعه کد زیر را وارد کنید:
1 |
W = DW |
عدد 1500 که در Dw وجود دارد در W ذخیره خواهد شد!
نتیجهگیری
موقع کدنویسی با کامپایلر بسکام به این نکات ظریف توجه داشته باشید و همیشه محاسبات خاص را در یک فایل جدا شبیهسازی کنید تا مشکلات احتمالی را ببینید و برنامههای بدون ایراد بنویسید.
بازدیدها: 36