অফ-বাই-ওয়ান এরর (Off-by-one error)

“There are two hard things in Computer Science: Cache invalidation, naming things and off-by-one error”  

উপরের লাইনটি কম্পিউটার বিজ্ঞানের খুব জনপ্রিয় একটি জোক। প্রথম প্রথম যখন আমি প্রোগ্রামিং শেখা শুরু করি, প্রোগ্রাম সফলভাবে কম্পাইল করলেই খুব মজা লাগতো। ইনপুট/আউটপুট দেয়ার পর যখন দেখতাম কোড ঠিকমত কাজ করছে না, তখন আবার চুপসে যেতাম। এমন সমস্যার মুখোমুখি আমরা সবাই হই। লজিকের সমস্যা হলে এমনটি হয়ে থাকে। এমন একটি লজিক্যাল এরর হচ্ছে অফ-বাই-ওয়ান এরর।

অফ বাই ওয়ান এরর কী

“অফ-বাই-ওয়ান এরর” সাধারণভাবে “অফ-বাই-ওয়ান বাগ” নামেও পরিচিত। সংক্ষেপে একে OBOE (Off By One Error ) বলা হয়ে থাকে। যখন কোন লুপের বাউন্ডারি কন্ডিশনে আমরা ভুল করি তখন এই এরর দেখা দেয়। বেশিরভাগ সময় এই এররটি হয় যখন আমরা “is less than equal” (<=) অপারেটরটি কোন তুলনা বা comparison-এর জন্য ব্যবহার করে থাকি বা যখন একটি সিকোয়েন্স শূন্য থেকে শুরু হওয়ার বদলে এক থেকে শুরু হয়।

প্রোগ্রামিং -এ যখন একটি iterative লুপ একই সময়ে কম বা বেশি সময় ধরে চলে তখন অফ বাই ওয়ান এরর সমস্যাটি দেখা দেয়। অর্থাৎ, যদি আমরা n পর্যন্ত কোনো একটি লুপ চালাতে চাই কিন্তু সেটিকে লেখার সময় বাউন্ডারি কন্ডিশন  n+1 অথবা n-1 দিয়ে দেই। অ্যারের কাজ করার সময় আমরা অনেকসময় লুপের মান শূন্য থেকে শুরু করার পরিবর্তে এক থেকে শুরু করি। পরবর্তীতে যখন আমরা অ্যারের উপাদানগুলো প্রিন্ট করতে যাই, দেখা যায় একটি অতিরিক্ত সংখ্যা প্রিন্ট হচ্ছে।

অ্যারের লুপের অফ-বাই-ওয়ান এরর

ধরা যাক, আমাদের পাঁচটি উপাদানের একটি অ্যারে দেয়া আছে। আমরা যদি অ্যারের উপাদানগুলো প্রিন্ট করতে চাই তাহলে আমাদের একটি লুপ চালাতে হবে যেটি অ্যারের পাঁচটি উপাদান ঠিকঠাক প্রিন্ট করে। যদি আমরা এভাবে কোডটি লিখিঃ

Untitled

এখানে লুপটি 0 থেকে শুরু  করে 0,1,2,3,4,5 এভাবে ছয়টি iteration সম্পন্ন করছে। যেটি অ্যারে সাইজ n-কে অতিক্রম করেছে। অ্যারের ক্ষেত্রে আমরা এটিকে “অ্যারে বাউন্ড এক্সেপশন” বলে থাকি। অফ-বাই-ওয়ান এরর-এর কারণে এমনটি হয়ে থাকে।  এখানে for loop-টি n+1 সংখ্যক বার চলেছে। কিন্তু যদি আমরা লুপটির end condition-এ “<=” এর পরিবর্তে “<” ব্যবহার করি, তখন আমাদের লুপটি 0,1,2,3,4 এভাবে মোট পাঁচটি iteration সম্পন্ন করে n সংখ্যকবার চলবে।

তবে, সি++ এর ক্ষেত্রে “আউট অফ বাউন্ড এক্সেপশন” থ্রো করে না। বিগিনারদের এটি বেশ ঝামেলায় ফেলে। তখন দেখা যায়, অ্যারে সাইজ ছোট নেয়ার পরেও কোন রান টাইম এরর দেখায় না।

ফেন্সপোষ্ট এরর

ফেন্সপোষ্ট এরর যা টেলিগ্রাফ পোল বা ল্যাপপোষ্ট এরর নামেও পরিচিত। এটিও একপ্রকার অফ-বাই-ওয়ান এরর। ফেন্সপোষ্ট এররে একটি প্রশ্ন করা হয়ে থাকে যে, যদি একটি সোজা বেড়ার n সংখ্যক ভাগ থাকে তাহলে মোট কতটি পোষ্ট সেখানে আছে।

598px-Fencepost_error.svg

প্রশ্নটির উত্তর যদি 10 বলা হয় তাহলে উত্তরটি হবে ভুল। যদি n+1 সংখ্যক পোষ্ট দিয়ে একটি বেড়া তৈরি করা হয় তাহলেই আমরা n সংখ্যক ভাগ পাবো সেই বেড়াটির। উপরের ছবিটি দিয়ে ব্যাপারটি বুঝানো হয়েছে।

 লেখক: তামান্না নিশাত রিনি।