Off-by-one error: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Funzionalità collegamenti suggeriti: 2 collegamenti inseriti.
m Prosa
Etichette: Modifica visuale Modifica da mobile Modifica da web per mobile Modifica da mobile avanzata
 
(2 versioni intermedie di un altro utente 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,: questo confligge col vistofatto 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++)
{