Pourquoi faire simple quant on peut faire compliqué ?
La solution simple et efficace en C c'est :
Si tu analyse le code produit par le compilateur, tu t'aperçois que code est transformé en un entier plus ou moins continu qui est ensuite utilisé pour attaquer un tableau d'adresses.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 switch (code) { case 1 : ...; break; case 6 : ...; break; case 'c' : ...; break; case 10 : ...; break; case 'a' : ...; break; case 11 : ...; break; ..... default : ....; break; }
Mon code de l'époque était d'autant plus navrant que l'instruction correspondante existe en PL1 :
C'est un type d'instruction qui date pratiquement depuis les débuts de la programmation. C'est ainsi que l'on peut écrire en COBOL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT; WHEN (CODE=1) ... ; WHEN (CODE=6) ... ; WHEN (CODE="c") ... ; WHEN (CODE=10) ... ; WHEN (CODE="a") ... ; WHEN (CODE=11) ... ; ... OTHERWISE ... END;
C'est évidemment du COBOL, donc horrible, mais il faut prendre en compte l'époque.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Algorithme transformant CODE en un entier continu allant de 1 à 399 (si 400 cas). GO TO P1 P2 P3 P4 ... P999 DEPENDING ON CODE. P1. .... GO TO SORTIE. P2. .... GO TO SORTIE. ..... SORTIE..
Mais ceci m'a rappelé une autre bévue monumentale, pas du code mal foutu, mais une erreur qui m'a bloqué pendant pratiquement deux semaines.
C'était sur mon premier ordinateur, un IBM 1620 (si il y a ici des gens qui l'on connut, il auront sans doute un souvenir émut), en 1964.
La 1620 ne pouvait se programmer qu'en assembler ou en FORTRAN. Il s'agissait d'un programme écrit en assembler dans lequel j'avais écrit :
Le bug faisait que toute la mémoire était remplie d'un nombre arbitraire, pratiquement jamais le même, impossible d'avoir un état mémoire "post mortem", j'ai passé deux semaine avant de trouver. Parce que chaque fois que j'analysais le code, je me disais, je fais bien le transfert (affectation) donc c'est OK, etc, etc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ASSEMBLER : ÉQUIVALENT C : TF VALEUR,4 valeur = *4; A la place de : TFM VALEUR,4 valeur = 4;
Partager