Akses ke indeks array yang tidak ada

Itu perlu untuk menulis ulang kode dari satu bahasa ke bahasa lain, dan menemukan bahwa ketika mengakses indeks array tidak ada, bahasa yang berbeda berperilaku berbeda. Detail di bawah potongan.


gambar

Berikut adalah contoh kode dalam Teks Terstruktur, yang digunakan untuk memprogram pengontrol industri. Program dalam bahasa ini dapat melakukan berbagai tindakan, dari mengendalikan lampu lalu lintas hingga mengendalikan proses di pembangkit listrik tenaga nuklir. Spesifikasi bahasa dan platform dihormati, sehingga kode mungkin terlihat sangat tidak biasa.


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; 

Apa yang dilakukan program ini? Membaca data dari sinyal input dan menulis aksi kontrol ke variabel OUT. Nilai variabel ini akan menjadi 15. Sekarang kami memperkenalkan beberapa kesalahan ke dalam program, secara khusus mengambil elemen pada indeks yang tidak ada dalam array dan melihat hasilnya.


 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; 

Nilai dalam variabel OUT = 15

Itu sama dengan sebelum kesalahan. Program ini tidak membuang pengecualian, tetapi mengabaikan elemen yang tidak ada. Perilaku ini cukup dapat diterima bagi kita jika kita tidak sengaja menangani pengecualian dan mengelola batang darurat reaktor nuklir. Tindakan kontrol dari variabel OUT akan sama seperti sebelum perubahan indeks yang salah. Jika ini adalah kegagalan jangka pendek, maka sistem tidak akan menanggapi kesalahan dan akan terus bekerja lebih stabil. Sekarang bayangkan bahwa berbagai program dalam bahasa pemrograman lain melakukan tugas yang sama dan membandingkan hasilnya.


Kode tanpa indeks yang salah dijalankan secara identik dalam semua bahasa pemrograman dan variabel OUT selalu memiliki nilai 15. Kami hanya akan mempertimbangkan kode di mana kesalahan merangkak dengan nilai indeks mulai sama dengan -1.


Javascript


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

OUT = NaN

Pergi


 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) } 

panik: runtime error: indeks di luar jangkauan

Jawa


 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); } } 

Pengecualian di utas "utama" java.lang.ArrayIndexOutOfBoundsException: -1

Php


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

OUT = 15
Pemberitahuan PHP: Offset yang tidak ditentukan: -1

Python 3


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

OUT = 20

Dalam Python, indeks negatif didukung, dan penomoran berjalan dari akhir array.


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; } 

Dengan bahasa C ++, cerita terpisah. Jika Anda ingin memeriksa contoh ini di situs populer, Anda akan mendapatkan hasil ini:


http://codepad.org


OUT = -143484461

https://ideone.com/ et al.


OUT = 15

https://www.jdoodle.com


OUT = 14

Pada artikel ini, saya tidak akan membahas detail tentang kompiler C / C ++ mana platform yang digunakan situs ini. Saya akan sangat senang jika Anda membagikan pendapat Anda di komentar.


C tajam


 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); } } 

Pengecualian Tidak Tertangani:
System.IndexOutOfRangeException: Indeks berada di luar batas array.

Kesimpulan


Saat menulis kode dalam bahasa pemrograman apa pun, Anda perlu mempertimbangkan fitur bekerja dengan struktur data dalam bahasa tersebut. Juga pertimbangkan semua tempat dalam kode tempat program dapat "macet". Seringkali, setelah pengecualian, kode program tidak lagi dapat dikembalikan ke baris kesalahan, dan tindakan penting dapat dilakukan di bawah kode. Oleh karena itu, tidak semua bahasa cocok untuk menyelesaikan masalah tertentu atau memerlukan pemeriksaan tambahan dan cabang kode. Dalam bahasa standar IEC, ada perlindungan terhadap kesalahan perangkat lunak primitif, karena sering kali tidak ada yang membebani program pengontrol ketika kegagalan terjadi dan operasi ini juga bisa berakibat fatal dalam beberapa situasi.

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


All Articles