Off-by-one error: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m Prosa
Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile Modifica da mobile avanzata
 
(6 versioni intermedie di 4 utenti non mostrate)
Riga 1:
Un '''off-by-one error''' ('''OBOE'''), detto anche '''off-by-one bug''' ('''OBOB'''), è un errore logico di [[Programmazione (informatica)|programmazione]] che avviene quando un [[Iterazione|ciclo iterativo]] viene eseguito una volta di più o una volta di meno di quanto volutodesiderato, a causa di un errore nella specifica della condizione di verità. SolitamenteDi solito ciò accade quando il programmatore sceglie erroneamenteper errore il simbolo di ''minore o uguale'' al posto del simbolo ''minore'' (o viceversa), o il simbolo ''maggiore o uguale'' al posto di ''maggiore'' (o viceversa), oppure quando commette un errore nell'inizializzazione della [[variabile (informatica)|variabile]] testatache controlla l'iterazione, settandolaponendone il valore iniziale a uno anziché a zero,: vistoquesto confligge col fatto che in molti [[Linguaggio di programmazione|linguaggi di programmazione]] l'indice di un [[array]] cominciainizia da zero. QuestoIn questo errore si può incorrere anche capitare in contesti matematici, per esempio se usata come divisore in una divisione (nel qual caso è bene sia settataimpostata a valori diversi da zero, per evitare [[Eccezione (informatica)|eccezioni]] del tipo ''[[divisione per zero]]'').
 
== Iterazioni oltre il termine dell'array ==
Consideriamo un [[array]] di oggetti, dei quali dobbiamo processareelaborare quelli da un certo valore ''m'' ada uno ''n'' (estremi inclusi). Quanti elementi si trovano in questo rangeintervallo? Una risposta intuitivairriflessa potrebbe essere ''n'' – ''m'', ma questo è proprio un errore di off-by-one, più precisamente del tipo ''fencepost''; la risposta corretta è infatti (''n'' – ''m'') + 1.
 
Proprio per via di questa contro-intuitività, i range nell'informatica sono spesso rappresentati da [[Intervallo (matematica)|intervalli]] semi-aperti; il range da ''m'' ad ''n'' inclusivo infatti, è rappresentato dagli elementi che vanno da ''m'' (incluso) ada ''n'' + 1 (escluso), proprio per evitare errori di fancepost. Per esempio, un [[Iterazione|ciclo]] che itera cinque volte (da 0 a 4 incluso) può essere scritto in [[C (linguaggio)|C]] come un intervallo semi-aperto da 0 a 5:<syntaxhighlight lang="c">
for (i = 0; i < 5; i++)
{
Riga 18:
 
== Errore fencepost ==
[[File:Fencepost error 01.svg|miniatura|upright=1.2|Una recinzione dritta con ''n'' sezioni ha {{Nowrap|''n'' + 1}} paletti]]
Un '''errore fencepost''' (letteralmente "staccionata", chiamato anche '''telegraph pole''', '''lamp-post''' o '''picket fence''') è un tipo specifico di errore di off-by-one. Una descrizione primitiva di questo errore apparve nei testi di [[Marco Vitruvio Pollione|Vitruvio]].<ref>{{Cita web|url=http://www.dsm.fordham.edu/~moniot/Opinions/fencepost-error-history.shtml|titolo=History of fence-post error|sito=dsm.fordham.edu|lingua=en|citazione=Here is what Vitruvius had to say about the fence-post error:
 
Riga 41:
La risposta corretta dovrebbe essere ''n'' – 1 se la sequenza di paletti è aperta alla fine, ''n'' se si chiudono a cerchio, o ''n'' + 1 se il lato aperto della sequenza di paletti è considerato come una sezione. Bisogna prestare molta attenzione alla definizione precisa del problema, perché il setup di una certa configurazione potrebbe dare la risposta sbagliata per altre. Errori di fencepost derivano in sostanza dal contare gli elementi piuttosto che gli spazi che li separano e viceversa, o trascurando di considerare se l’oggetto in esame dovrebbe essere contato soltanto in uno o in entrambi gli estremi della fila.
 
Errori di fencepost possono inoltre verificarsi in [[unità di misura]] diverse dalle lunghezze. Ad esempio, la “Time Pyramid” è una costruzione costituita da 120 blocchi da piazzarsi a distanza di 10 anni l’uno dall’altro. Saranno quindi necessari 1190 anni per la costruzione completa, dal piazzamento del primo blocco sino all’ultimo, e non 1200. Uno dei primi errori di tipo fencepost vide coinvolta l’unità di misura temporale, nel caso specifico del [[Calendario giuliano|calendario Giuliano]]. Esso originariamente calcolava gli [[Calendario giuliano#Anni bisestili|anni bisestili]] in maniera errata, considerandoli in maniera inclusiva invece che esclusiva, originandone quindi uno ogni 3 anni invece che quattro.
 
Un errore di fencepost può, in rari casi, essere collegato ad un errore introdotto da regolarità inaspettate in valori di input, che possono (per esempio) contrastare completamente con un’implementazione teoricamente efficiente di [[Albero binario|alberi binari]] o [[Funzione di hash|funzioni di hash]]. Questo errore può implicare il verificarsi dei casi peggiori di un [[algoritmo]], invece che quelli attesi.