Es war notwendig, den Code von einer Sprache in eine andere umzuschreiben, und es wurde festgestellt, dass sich verschiedene Sprachen beim Zugriff auf einen nicht vorhandenen Array-Index unterschiedlich verhalten. Details unter dem Schnitt.

Hier ist ein Beispielcode in Structured Text, mit dem industrielle Steuerungen programmiert werden. Programme in dieser Sprache können verschiedene Aktionen ausführen, von der Steuerung einer Ampel bis zur Steuerung von Prozessen in einem Kernkraftwerk. Die Besonderheiten der Sprache und Plattform werden respektiert, sodass der Code möglicherweise recht ungewöhnlich aussieht.
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;
Was macht dieses Programm? Liest Daten von Eingangssignalen und schreibt Steueraktion in die OUT-Variable. Der Wert dieser Variablen ist 15. Nun führen wir einen Fehler in das Programm ein, indem wir speziell ein Element an einem nicht vorhandenen Index im Array nehmen und das Ergebnis betrachten.
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;
Der Wert in der Variablen OUT = 15
Das ist das gleiche wie vor dem Fehler. Das Programm hat keine Ausnahme ausgelöst, sondern das nicht vorhandene Element einfach ignoriert. Dieses Verhalten ist für uns durchaus akzeptabel, wenn wir die Ausnahme nicht versehentlich behandelt und die Notstäbe eines Kernreaktors verwaltet haben. Die Steueraktion der OUT-Variablen ist dieselbe wie vor der fehlerhaften Indexänderung. Wenn dies ein kurzfristiger Fehler ist, reagiert das System nicht auf den Fehler und arbeitet stabil weiter. Stellen Sie sich nun vor, dass verschiedene Programme in anderen Programmiersprachen dieselbe Aufgabe ausführen und die Ergebnisse vergleichen.
Code ohne fehlerhaften Index wird in allen Programmiersprachen identisch ausgeführt, und die Variable OUT hat immer den Wert 15. Wir betrachten nur den Code, in den sich der Fehler eingeschlichen hat, wobei der Wert des Startindex gleich -1 ist.
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
Geh
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: Laufzeitfehler: Index außerhalb des Bereichs
Java
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); } }
Ausnahme im Thread "main" 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
PHP-Hinweis: Undefinierter Offset: -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
In Python werden negative Indizes unterstützt und die Nummerierung erfolgt ab dem Ende des Arrays.
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; }
Mit der C ++ - Sprache eine separate Geschichte. Wenn Sie dieses Beispiel auf beliebten Websites überprüfen möchten, erhalten Sie die folgenden Ergebnisse:
http://codepad.org
OUT = -143484461
https://ideone.com/ et al.
OUT = 15
https://www.jdoodle.com
OUT = 14
In diesem Artikel werde ich nicht näher darauf eingehen, welche C / C ++ - Compiler auf welchen Plattformen diese Websites verwenden. Ich würde mich sehr freuen, wenn Sie Ihre Meinung in den Kommentaren teilen.
Cis
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); } }
Unbehandelte Ausnahme:
System.IndexOutOfRangeException: Der Index lag außerhalb der Grenzen des Arrays.
Schlussfolgerungen
Wenn Sie Code in einer beliebigen Programmiersprache schreiben, müssen Sie die Funktionen zum Arbeiten mit Datenstrukturen in der Sprache berücksichtigen. Berücksichtigen Sie auch alle Stellen im Code, an denen das Programm möglicherweise abstürzt. Nach einer Ausnahme kann der Programmcode häufig nicht mehr an die Fehlerzeile zurückgegeben werden, und wichtige Aktionen können unterhalb des Codes ausgeführt werden. Daher sind nicht alle Sprachen zur Lösung bestimmter Probleme geeignet oder erfordern zusätzliche Überprüfungen und Code-Verzweigungen. In den Sprachen der IEC-Norm besteht Schutz vor primitiven Softwarefehlern, da häufig niemand das Steuerungsprogramm überlastet, wenn ein Fehler auftritt, und dieser Vorgang kann in einigen Situationen auch schwerwiegend sein.