La Cause de l'Erreur de Vérification de Plage (Delphi)
Voici une version condensée d'un code qui provoque à la fois une erreur de vérification de Plage et une erreur de dépassement de capacité, devrais-je tourner sur ceux compilateur de vérifier les directives. Je comprends pourquoi ce serait provoquer un dépassement de capacité, sur la multiplication de la C1, il semble probable qu'il pourrait dépasser les données de type max valude. Mais pourquoi en serait-il également déclencher une erreur de vérification? Delphi documentation et les autres postes sur un débordement de pile à les faire sonner comme de la gamme, à vérifier les erreurs sont généralement pour des accès à des tableaux qui sont en dehors des limites. Mais je ne suis pas accès à un tableau sur la ligne il est dit, est à l'origine de la gamme-erreur de vérification. Peut-être son sur la cession à param1? Mais pourquoi serait-ce une gamme de vérifier et pas une erreur de dépassement de capacité, le cas échéant?
const
C1 = 44001;
C2 = 17999;
function fxnName(..other params...; param1: Word): String;
var
someByte: byte;
begin
// some code
// by now we're in a loop. the following line is where it breaks to in the debugger:
param1 := (someByte + param1) * C1 + C2;
// more code
end;
Si c'est pertinent, lorsqu'elle tombe sur cette ligne dans le débogueur, toutes les valeurs de regarder comme prévu, sauf param1, ce qui montre "identificateur non déclaré: 'param1'" quand je demande à Delphes pour l'évaluer.
OriginalL'auteur Jessica Brown | 2012-07-25
Vous devez vous connecter pour publier un commentaire.
Les documents sur la plage de vérification des états:
Donc, la raison ici est l'affectation d'une valeur scalaire, qui est remis une valeur qui a passé la limite supérieure de la fourchette.
Voir aussi docwiki Types Simples sur la gamme de vérification des erreurs sur les types simples et les types de sous-intervalle.
Exemple:
Un résumé de l'essai de toutes les combinaisons de $R $et Q pour tout indépendant de la plate-types d'entiers:
R=erreur de Plage; O=erreur de Dépassement de capacité; x=Rien
Et le test a été(pseudo-code) avec XE2 en mode 32 bits:
Il sera sans doute erreur de dépassement de capacité si le type de données entier
Si le calcul est effectué sur
Integer
types, bien sûr, maisi := i + Int64(1);
doit (non testé) cause une erreur de portée lorsquei
est unInteger
avec une valeur deMaxInt
.la gamme d'erreur en effet.
Belle table! Pour résumer, type < 32 octets -> erreur de plage, type => 32 octets -> erreur de dépassement de capacité. Assez bizarre..
OriginalL'auteur LU RD