الوصول إلى فهرس صفيف غير موجود

كان من الضروري إعادة كتابة التعليمات البرمجية من لغة إلى أخرى ، ووجدت أنه عند الوصول إلى فهرس صفيف غير موجود ، تتصرف لغات مختلفة بشكل مختلف. التفاصيل تحت القطع.


الصورة

في ما يلي نموذج للرمز في النص المهيكل ، يُستخدم لبرمجة وحدات التحكم الصناعية. يمكن للبرامج بهذه اللغة تنفيذ إجراءات مختلفة ، من التحكم في إشارة المرور إلى التحكم في العمليات في محطة الطاقة النووية. يتم احترام تفاصيل اللغة والنظام الأساسي ، لذلك قد تبدو الشفرة غير عادية تمامًا.


VAR i: INT; OUT: INT; IN: ARRAY [0..4] of INT:= 1, 2, 3, 4, 5; END_VAR OUT := 0; FOR i:= 0 TO 4 DO OUT := OUT + IN[i]; END_FOR; 

ماذا يفعل هذا البرنامج؟ يقرأ البيانات من إشارات الإدخال ويكتب إجراء التحكم إلى متغير OUT. ستكون قيمة هذا المتغير هي 15. الآن نقدم بعض الأخطاء في البرنامج ، على وجه التحديد أخذ عنصر في فهرس غير موجود في الصفيف وإلقاء نظرة على النتيجة.


 VAR i: INT; OUT: INT; IN: ARRAY [0..4] of INT:= 1, 2, 3, 4, 5; END_VAR OUT := 0; FOR i:= -1 TO 4 DO OUT := OUT + IN[i]; END_FOR; 

القيمة في المتغير OUT = 15

هذا هو نفسه قبل الخطأ. لم يلق البرنامج استثناءً ، ولكنه تجاهل ببساطة العنصر غير الموجود. هذا السلوك مقبول تمامًا بالنسبة لنا إذا لم نتعامل عن طريق الخطأ مع الاستثناء وقمنا بإدارة قضبان الطوارئ لمفاعل نووي. سيكون إجراء التحكم في متغير OUT هو نفسه قبل تغيير الفهرس الخاطئ. إذا كان هذا فشلًا قصير المدى ، فلن يستجيب النظام للخطأ وسيواصل العمل بثبات أكبر. تخيل الآن أن البرامج المختلفة بلغات البرمجة الأخرى تؤدي نفس المهمة وقارن النتائج.


يتم تنفيذ التعليمات البرمجية التي لا تحتوي على فهرس خاطئ بشكل متماثل في جميع لغات البرمجة ويكون للمتغير OUT دائمًا القيمة 15. سنأخذ في الاعتبار فقط الرمز حيث تسلل الخطأ مع قيمة فهرس البداية يساوي -1.


جافا سكريبت


 var IN = [ 1, 2, 3, 4, 5 ]; var OUT = 0; for (var i = -1; i <= 4; i++) { OUT += IN[i]; } console.log('OUT = '+ OUT); 

خارج = NaN

اذهب


 package main import "fmt" func main() { IN := [5]int{ 1, 2, 3, 4, 5 } OUT := 0 for i := -1; i <= 4; i++ { OUT += IN[i] } fmt.Printf("OUT = %d", OUT) } 

الذعر: خطأ وقت التشغيل: الفهرس خارج النطاق

جافا


 public class MyClass { public static void main(String args[]) { int[] IN = {1, 2, 3, 4, 5}; int OUT = 0; for (int i = -1; i <= 4; i++) OUT += IN[i]; System.out.printf("OUT = %d", OUT); } } 

استثناء في الموضوع الرئيسي "java.lang.ArrayIndexOutOfBoundsException: -1

فب


 <?php $IN = [1, 2, 3, 4, 5]; $OUT = 0; for ($i=-1; $i<=4; $i++) { $OUT += $IN[$i]; } echo('OUT = '.$OUT); 

خارج = 15
إشعار PHP: إزاحة غير محددة: -1

بيثون 3


 IN = [ 1, 2, 3, 4, 5 ]; OUT = 0; for i in range(-1, 5): OUT += IN[i]; print('OUT = {0:1d}'.format(OUT)); 

خارج = 20

في Python ، يتم دعم الفهارس السلبية ، وينتقل الترقيم من نهاية المصفوفة.


C / C ++


 #include<stdio.h> int main() { int IN[]= {1,2,3,4,5}; int OUT=0; int i; for (i=-1; i<=4; i++) { OUT += IN[i]; } printf("OUT = %i", OUT); return 0; } 

مع لغة C ++ ، قصة منفصلة. إذا كنت تريد التحقق من هذا المثال على المواقع الشهيرة ، فستحصل على هذه النتائج:


http://codepad.org


OUT = -143484461

https://ideone.com/ et al.


خارج = 15

https://www.jdoodle.com


خارج = 14

في هذه المقالة ، لن أخوض في التفاصيل حول أي من المترجمين C / C ++ على الأنظمة الأساسية التي تستخدمها هذه المواقع. سأكون سعيدًا جدًا إذا شاركت رأيك في التعليقات.


C حاد


 using System; class Program { static void Main() { int[] IN = new int[] { 1, 2, 3, 4, 5 }; int OUT = 0; for (int i = -1; i <= 4; i++) { OUT += IN[i]; } Console.Write("OUT of IN + y = "+ OUT); } } 

استثناء غير معالج:
System.IndexOutOfRangeException: كان الفهرس خارج حدود الصفيف.

الاستنتاجات


عند كتابة تعليمات برمجية بأي لغة برمجة ، تحتاج إلى مراعاة ميزات العمل مع هياكل البيانات في اللغة. ضع في اعتبارك أيضًا جميع الأماكن في الرمز حيث قد "يتعطل" البرنامج. في كثير من الأحيان ، بعد استثناء ، لم يعد من الممكن إرجاع رمز البرنامج إلى سطر الخطأ ، ويمكن تنفيذ إجراءات مهمة أسفل الرمز. لذلك ، ليست كل اللغات مناسبة لحل مشاكل معينة أو تتطلب عمليات فحص إضافية وفروع الرموز. في لغات معيار IEC ، هناك حماية ضد أخطاء البرامج البدائية ، حيث لا يوجد في كثير من الأحيان أي شخص يفرط في تحميل برنامج التحكم عند حدوث فشل ويمكن أن تكون هذه العملية قاتلة أيضًا في بعض الحالات.

Source: https://habr.com/ru/post/ar415911/


All Articles