نکته اولیکسری از نقاط برنامه خطاهایی مثل Divide by zero و Index out of band داره و ممکنه باعث تولید Exception بشه ...
خطای Divide by zero از نوع خطاهای زمان کامپایل هست، تقریبا همه کامپایلرهای معتبر در زمان کامپایل این خطا را میگیرند، در زمان اجرا هم اگر یکی از مقادیر عملیات تقسیم 0 شده باشه بازهم یک
Unhand-led exception ساطع میشه حتی اگر درون یک بلاک try-catch عملیات تقسیم انجام شده باشه که این خطا هم مستقیما به کد اسمبلی تولید شده مربوط هست یعنی دستور IDIV OR DIV البته به غیر از دستورات سری SSE نمی توان یکی از عملوندهای دستورات فوق را صفر قرار داد به همین علت خطای تقسیم بر صفر عملا غیر قابل دور زدن می باشد
نکته دوم
خطای index out of bound هم که از اون دسته خطاهای امنیتی هست که در زمان کامپایل فقط یک هشدار ساطع میشود البته نه در همه کامپایلرها ولی در زمان اجرا هم بسته به شرایط overlap شدن آفست ها میتواند باعث کرش برنامه شود ولی در خیلی از مواقع هم برنامه کرش نخواهد کرد ولی قطعا رفتار تعریف نشده برای برنامه رخ خواهد داد.
از چه نسخه ای از کامپایلر و ویژوال استودیو استفاده میکنید؟تا وقتی که این کد بصورت یه برنامه Console در VS اجرا میشه مشکلی نیست و از روی خطاها عبور می کنه و الگوریتم رو هرچند غلط به پایان می رسونه. این ممکنه به خاطر غیرفعال بودن Exception ها باشه!
چون در صورت رخداد خطای تقسیم بر 0 در هر نوع باینری فایلی چه DLL , چه EXE برنامه کرش خواهد کرد.
برای خطا تقسیم بر 0 راههای زیادی وجود داره ولی ساده ترین چک کردن مقادیر متغیرها قبل از عملیات تقسیم هستضمنا ممکنه بگید که خوب خطاهایی که باعث Exception میشه رو اصلاح کنم! اما حجم کد خیلی زیاده و نیاز به بررسی زیادی داره و در واقع فعلا می خوام نسخه 64 بیتی مثل نسخه 32 بیتی حداقل بدون خطا اجرا بشه.
برای خطا اندیس خارج از محدوده هم باید با استفاده از شرطهای کنترلی کنترل کنید یعنی قبل از هربار فراخوانی آفست آرایه ابتدا کنترل کنید که اندیس مورد اشاره تون بزرگتر از طول آرایه نباشه البته اگر امکان داشت براتون از ساختمان داده های سبک مثل std::vector , std::array استفاده کنید
در صورتی که مایل بودید میتونید تکه کدتون را همین جا قرار بدید