"Bir vahid" xətası

"Bir vahid" xətası (off-by-one error-OBOE) – proqramlaşdırmada: hər hansı əməlin yerinə yetirilmələrinin sayını bir vahid azaltdıqda, yaxud artırdıqda meydana çıxan xəta. Tutaq ki, verilmiş massivin m-dən n-dək (daxil olmaqla) elementləri emal olunmalıdır. Burada cəmi neçə element var? İntuitiv cavab n−m ola bilər, ancaq bu, "bir vahid"i nümayiş etdirən "çəpər dirəyi" xətasıdır (FENCEPOST ERROR); düzgün cavab n−m+1 olacaq. Ona görə də hesablama aralıqlarını çox zaman yarım-açıq intervallar vasitəsilə göstərirlər; "bir vahid" xətalarından qaçmaq üçün m-dən n-dək (daxil olmaqla) aralıq m-dən (daxil olmaqla) n+1-dək aralıq kimi göstərilir. Məsələn, beş dəfə təkrarlanan dövrü 0-dan 5-dək yarımaçıq interval kimi yazmaq olar:

Cədvəldə (n+1) addımı ilə ardıcıllığın qurulmasına nümunə
    for (i = 0; i < 5; i++) {
      /* Body of the loop */
    }

Dövrün gövdəsi öncə i-nin 0 qiyməti üçün yerinə yetirilir; sonra i ardıcıl iterasiyalarla 1, 2, 3 və sonda 4 olur. Bu nöqtədə i-nin qiyməti 5 olur və bu halda i < 5 yalan olduğundan dövr sona çatır. Ancaq müqayisə üçün <= (kiçik, yaxud bərabərdir) operatorundan istifadə oluncaydı, onda dövr altı dəfə yerinə yetirilərdi: bu halda i dəyişəni 0, 1, 2, 3, 4 və 5 qiymətlərini alır. Eyni zamanda, əgər i dəyişəninə başlanğıc qiymət olaraq 0 deyil, 1 mənimsədilsə idi, onda iterasiyaların sayı 4 olardı: bu halda i dəyişəni 1, 2, 3 və 4 qiymətlərini alır. Bu iki halın hər biri "bir vahid" xətasına səbəb ola bilər. Proqramlaşdırma dilləri arasındakı fərqlər massivlə bağlı bolaşıqlıqlar yarada bilər. Belə ki, əksər dillərdə massivin elementlərinin nömrələnməsi 0-dan başlanır, ancaq bəzi dillərdə ilk elementin nömrəsi 1 götürülür. Pascal dilində isə ilk elementin nömrəsini istifadəçi özü müəyyən edə bilir.

Ədəbiyyat

redaktə

Xarici keçidlər

redaktə

Off-by-one error

Off-by-one error haqqında nümunələr

OBOE Arxivləşdirilib 2017-11-26 at the Wayback Machine