Comportamento imprevisto del programma: ricerca di errori logici

Aggiornamento: novembre 2007

In questa lezione verrà descritto come rilevare errori logici in un programma.

Nelle lezioni precedenti è stato descritto come rilevare e correggere errori del compilatore ed errori di runtime. Il terzo tipo di errori di programmazione, quelli logici, sono i più difficili da individuare. Nel caso di errori logici non viene visualizzato alcun avviso: il programma viene eseguito, ma vengono restituiti risultati non corretti. È pertanto necessario esaminare il codice per individuarne la causa.

Gli strumenti di debug di Visual Basic possono facilitare questa operazione. Per individuare l'errore sono disponibili due tecniche di debug, ossia l'impostazione di punti di interruzione e il debug passo a passo, che consentono di esaminare ogni singola riga durante l'esecuzione del codice.

Nell'editor di codice è possibile impostare un punto di interruzione in qualsiasi riga di codice eseguibile. Quando il programma viene eseguito, al raggiungimento della riga di codice in questione i punti di interruzione impongono l'arresto del programma e l'attivazione della modalità di interruzione. A questo punto è possibile ottenere tutte le informazioni desiderate sullo stato del programma. È quindi possibile controllare il valore delle variabili, verificare le espressioni nella finestra Controllo immediato oppure apportare modifiche al codice tramite la funzionalità Modifica e continuazione.

In modalità di interruzione è inoltre possibile eseguire il debug passo a passo del codice per controllarne il funzionamento. Se si preme F8 viene eseguita la riga di codice corrente e il programma viene interrotto in corrispondenza della riga successiva. È quindi possibile controllare i valori delle variabili per verificare le modifiche rispetto alla riga precedente.

Se la riga di codice corrente chiama una funzione o una routine di tipo Sub in un altro punto del codice, quando si preme F8 l'esecuzione passerà a tale routine. Al termine del debug passo passo della routine, si passa automaticamente alla riga successiva a quella da cui è stata chiamata la routine. Se non si desidera eseguire il debug passo a passo di una routine, è possibile premere MAIUSC+F8 per ignorare tale routine.

Procedura

Per osservare un errore logico

  1. Scegliere Nuovo progetto dal menu File.

  2. Nel riquadro Modelli della finestra di dialogo Nuovo progetto fare clic su Applicazione Windows.

  3. Digitare LogicErrors nella casella Nome, quindi scegliere OK.

    Verrà aperto un nuovo progetto Windows Form.

  4. Dalla Casella degli strumenti trascinare due controlli TextBox e un controllo Button nel form.

  5. Fare doppio clic su Button1 per aprire l'editor di codice.

  6. Nel gestore eventi Button1_Click aggiungere il codice riportato di seguito.

    Dim minutes As Integer = CInt(Textbox1.Text)
    Dim miles As Double = CDbl(Textbox2.Text)
    Dim hours As Double = 0
    hours = minutes / 60
    MsgBox("Average speed " & GetMPH(hours, miles))
    
  7. Aggiungere la funzione riportata di seguito sotto la riga End Sub.

    Function GetMPH(ByVal miles As Double, ByVal hours As Double) _
    As String
        GetMPH = CStr(miles / hours)
    End Function
    
  8. Premere F5 per eseguire il programma. Immettere 10 nella prima casella di testo per indicare il numero di minuti e 5 nella seconda casella di testo per indicare le miglia, quindi fare clic su Button1.

    Verrà visualizzata una finestra di messaggio in cui è indicato che il valore della velocità media è pari a 0,03333334. Se si percorrono 5 miglia in 10 minuti, la risposta corretta è tuttavia 30 miglia orarie.

    Tenere aperto il progetto perché nella procedura successiva verrà descritto come individuare l'errore logico.

Ricerca di errori logici

Nell'esempio precedente esiste un errore evidente nella logica del programma. Secondo il risultato, la velocità media è meno di un miglio orario anziché 30 miglia orarie come previsto.

Nella procedura successiva verrà impostato un punto di interruzione e verrà eseguito il debug passo a passo del codice per individuare l'errore.

Procedura

Per impostare un punto di interruzione ed eseguire il debug passo a passo del codice

  1. Nell'editor di codice individuare la riga hours = minutes / 60, quindi fare clic sul margine sinistro accanto a tale riga di codice.

    Sul margine verrà visualizzato un punto rosso e il codice verrà evidenziato in rosso per indicare la presenza di un punto di interruzione.

  2. Premere F5 per eseguire di nuovo il programma. Immettere 10 nella prima casella di testo e 5 nella seconda casella di testo. Fare clic su Button1.

    Quando il programma raggiungerà il punto di interruzione, l'esecuzione verrà interrotta. La riga hours = minutes / 60 viene evidenziata in giallo.

    Esaminare i valori delle variabili posizionando il puntatore del mouse su di esse: il valore di hours dovrebbe essere 0 e il valore di minutes dovrebbe essere 10.

  3. Premere F8 per eseguire la riga hours = minutes / 60 e passare alla riga successiva.

    Esaminare i valori delle variabili nella riga MsgBox("Average speed " & GetMPH(hours, miles)): il valore di hours dovrebbe essere 0.166666672 e il valore di miles dovrebbe essere 5.0.

  4. Premere di nuovo F8 per eseguire la riga corrente.

    Si noti che l'esecuzione passa alla riga Function GetMPH.

    Esaminare i valori delle variabili in questa riga: il valore di miles dovrebbe essere 0.166666672 e il valore di hours dovrebbe essere 5.0, ovvero l'opposto rispetto alla riga precedente. Questa è la causa dell'errore.

    Tenere aperto il progetto perché nella procedura successiva verrà descritto come correggere l'errore logico.

Correzione di errori logici

Nella procedura precedente si è verificata un'inversione dei valori delle variabili miles e hours. Vediamo come risalire alla causa.

Se si esamina la riga MsgBox("Average speed " & GetMPH(hours, miles)), si noterà che alla funzione GetMPH vengono passati i due argomenti hours e miles in questo ordine esatto. Se si analizza la dichiarazione della funzione Function GetMPH(ByVal miles As Double, ByVal hours As Double)..., si noterà che l'argomento miles è indicato per primo e hours per secondo.

L'errore logico si è verificato perché gli argomenti sono stati passati in un ordine errato, provocando l'esecuzione di un calcolo non corretto. Se gli argomenti fossero stati di tipo diverso, si sarebbe verificato un errore di runtime. L'errore non era complesso, ma individuarlo non è stato facile.

Nella procedura successiva verrà impostato un punto di interruzione e verrà eseguito il debug passo a passo del codice per individuare l'errore.

Procedura

Per correggere l'errore logico

  1. Nell'editor di codice modificare la riga MsgBox("Average speed " & GetMPH(hours, miles)) come illustrato di seguito:

    MsgBox("Average speed " & GetMPH(miles, hours))
    
  2. Cancellare il punto di interruzione facendo clic sul punto rosso nel margine sinistro.

  3. Premere F5 per eseguire il programma. Immettere 10 nella prima casella di testo e 5 nella seconda casella di testo. Fare clic su Button1.

    Nella finestra di messaggio verrà visualizzato il risultato corretto, ovvero una velocità media pari a 30 miglia.

    Nel programma è tuttavia presente un altro errore logico, persino più difficile da rilevare. Se si desidera provare a individuarlo, tenere aperto il progetto perché verrà utilizzato di nuovo nella lezione Un altro bug: errori difficili da individuare.

Passaggi successivi

In questa lezione è stato descritto come individuare e correggere un errore logico. A questo punto è possibile proseguire con la lezione successiva sull'utilizzo di commenti oppure provare a individuare un altro errore logico in Un altro bug: errori difficili da individuare.

Lezione successiva: Inserimento di note nei programmi: utilizzo dei commenti

Vedere anche

Attività

Problemi di funzionamento: ricerca ed eliminazione di errori di runtime

Cenni preliminari sugli errori: tre tipi di errori di programmazione

Ricerca di errori: introduzione al debug in Visual Basic