Il était nécessaire de réécrire le code d'une langue dans une autre et a constaté que lors de l'accès à un index de tableau inexistant, les différentes langues se comportaient différemment. Détails sous la coupe.

Voici un exemple de code dans Structured Text, qui est utilisé pour programmer des contrôleurs industriels. Les programmes dans ce langage peuvent effectuer diverses actions, du contrôle d'un feu de signalisation au contrôle des processus dans une centrale nucléaire. Les spécificités du langage et de la plateforme sont respectées, le code peut donc sembler assez inhabituel.
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;
Que fait ce programme? Lit les données des signaux d'entrée et écrit l'action de contrôle dans la variable OUT. La valeur de cette variable sera 15. Maintenant, nous introduisons une erreur dans le programme, en prenant spécifiquement un élément à un index inexistant dans le tableau et regardons le résultat.
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;
La valeur de la variable OUT = 15
C'est la même chose qu'avant l'erreur. Le programme n'a pas levé d'exception, mais a simplement ignoré l'élément inexistant. Ce comportement est tout à fait acceptable pour nous si nous n'avons pas géré accidentellement l'exception et géré les barres de secours d'un réacteur nucléaire. L'action de contrôle de la variable OUT sera la même qu'avant le changement d'index erroné. S'il s'agit d'une défaillance à court terme, le système ne répondra pas à l'erreur et continuera de fonctionner de manière stable. Imaginez maintenant que différents programmes dans d'autres langages de programmation effectuent la même tâche et comparent les résultats.
Le code sans index erroné est exécuté de manière identique dans tous les langages de programmation et la variable OUT a toujours la valeur 15. Nous ne considérerons que le code où l'erreur s'est glissée avec une valeur de l'index de départ égale à -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
Allez
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) }
panique: erreur d'exécution: index hors limites
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); } }
Exception dans le thread "principal" 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
Remarque PHP: décalage indéfini: -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
En Python, les index négatifs sont pris en charge et la numérotation part de la fin du tableau.
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; }
Avec le langage C ++, une histoire distincte. Si vous voulez vérifier cet exemple sur des sites populaires, vous obtiendrez ces résultats:
http://codepad.org
OUT = -143484461
https://ideone.com/ et al.
OUT = 15
https://www.jdoodle.com
OUT = 14
Dans cet article, je n'entrerai pas dans les détails sur les compilateurs C / C ++ sur quelles plateformes ces sites utilisent. Je serais très heureux si vous partagez votre opinion dans les commentaires.
C forte
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); } }
Exception non gérée:
System.IndexOutOfRangeException: l'index était en dehors des limites du tableau.
Conclusions
Lors de l'écriture de code dans n'importe quel langage de programmation, vous devez prendre en compte les fonctionnalités de l'utilisation des structures de données dans le langage. Tenez également compte de tous les endroits du code où le programme peut «planter». Souvent, après une exception, le code du programme ne peut plus être renvoyé à la ligne d'erreur et des actions importantes peuvent être effectuées sous le code. Par conséquent, toutes les langues ne conviennent pas pour résoudre certains problèmes ou nécessitent des vérifications et des branches de code supplémentaires. Dans les langues de la norme CEI, il existe une protection contre les erreurs logicielles primitives, car il n'y a souvent personne pour surcharger le programme du contrôleur en cas de défaillance et cette opération peut également être fatale dans certaines situations.