Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres

        


L'erreur 200 - Division par zéro
auteur : Hdd34
Victime de son succès, Turbo Pascal dure. Créé dans les années 80, il résiste encore 20 ans plus tard. Or, il n'a jamais été conçu pour une telle durée de vie, et n'est notamment pas prêt à affronter des processeurs de plus en plus véloces.
Ainsi, sur les processeurs de fréquence supérieure à 200 Mhz (tous les processeurs actuels, donc), les programmes utilisant l'unité Crt plantent sur une erreur 200 de division par zéro, alors qu'aucune division de ce genre n'est visible.
Une petite explication s'impose.
L'unité Crt contient, entre autres, la procédure Delay, qui permet de faire attendre l'utilisateur pendant un nombre donné de millisecondes. Or, pour que cette procédure fonctionne comme il faut, il faut l'étalonner. Ainsi, au lancement de votre programme, l'unité Crt va se charger calculer combien d'itérations d'une boucle simple sont possibles pour un nombre donné de cycles processeur. Ensuite, elle utilisera ce résultat pour générer une temporisation.
Mais dans ce que je viens d'expliquer, aucune division par zéro n'apparaît. En fait, avec un processeur de fréquence trop élevée pour Turbo Pascal, le nombre d'itérations possibles explose. Le processeur se retrouve donc devant un cas de débordement (overflow en anglais). Or, le débordement et la division par zéro déclenchent, pour le processeur, la même exception, autrement dit, le même code d'erreur. De fait, Turbo Pascal interprète cette erreur comme une division par zéro, et non comme un débordement.

Comment corriger ce problème ? Diverses solutions sont envisageables :

  • La politique de l'autruche : c'est l'unité Crt qui pose problème. Par conséquent, si un programme n'utilise pas cette unité, il ne rencontrera aucune erreur 200.
  • Une solution basique : ralentir le processeur. Mais cela pénalise alors l'ensemble de l'ordinateur, et on perd tous les avantages d'un processeur rapide. Si des logiciels existent pour cela, la solution n'est pas réellement viable.
  • La solution à préférer : corriger le problème à la source. Il suffit en effet d'éviter le débordement pour que tout rentre dans l'ordre. Borland s'est contenté d'utiliser un Word pour effectuer le calcul. Il suffirait d'utiliser un Longint pour solutionner le problème. C'est le rôle des divers patchs existant sur Internet.


Remarques :

  • Borland a toujours refusé de mettre un correctif à disposition des nombreux utilisateurs de Turbo Pascal. Ainsi, il n'existe aucun patch officiel : inutile d'en chercher un. Vous pouvez donc prendre le premier qui corrige le problème.

  • Si vous avez téléchargé Turbo Pascal sur www.developpez.com, vous ne rencontrerez jamais ce problème : la version de Turbo Pascal mise à disposition a déjà été patchée pour vous !


La perte des registres 32 bits
auteur : Hdd34
Turbo Pascal 7 a été créé peu après la sortie des premiers processeurs 32 bits. Ainsi, il possède quelques améliorations pour ce genre de processeurs : en particulier les opérations sur les Longint sont effectuées si possible à l'aide des registres processeurs 32 bits, pour un gain de temps.
Seul problème : Turbo Pascal n'a pas été conçu pour sauver ces registres. Par conséquent, les registres 32 bits sont toujours détruits, là où les registres 16 bits sont sauvegardés au besoin.

Cela ne pose aucun problème majeur, sauf lors de l'utilisation de gestionnaires d'interruption. En effet, dans ces gestionnaires, il convient de laisser le système en sortant du gestionnaire dans le même état que lors de l'entrée dans le gestionnaire. Or, ce n'est pas le cas avec les registres 32 bits !

Deux solutions sont possibles :

  • Vous pouvez choisir de sauver vous-même ces registres. Pour ce faire, écrivez votre gestionnaire de la sorte :


{$F+} procedure Gestionnaire; interrupt; begin asm db 66h; pusha { Sauvegarde des registres 32 bits } end; ... { Votre gestionnaire standard } asm db 66h; popa { Restauration des registres 32 bits } end; end; {$F-}



  • Vous pouvez demander à Turbo Pascal qu'il ignore le fait que votre programme tourne sur un processeur 32 bits. Pour ce faire, ajoutez tout au début de votre programme la ligne Test8086 := False; pour simuler un processeur 16 bits.


        

Consultez les autres F.A.Q's

Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2004  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2005 www.developpez.com