Errori

There’s a saying that the difference between theory and practice
is that in theory, there is no difference between theory and practice;
but in practice, there is.

Provo a riallacciarmi ai post precedenti raccontando un piccolo fatto capitato recentemente. Non so se i tre protagonisti di questa storiella saranno d’ora in poi classificati nella categoria dei programmatori amatoriali (io sono uno dei tre) ma questo è più o meno quello che è successo.

Il codice era in Fortran (l’ho imposto io, mi era stato imposto di imporlo) ma non è necessario conoscere il linguaggio.

MarkCC si è lamentato su Twitter di questa condizione

ma di solito in questi casi basta qualche correzione e il numero di errori segnalati cala rapidamente. Certo che 996 se sono il frutto di una persona sola fa pensare. A meno che abbia scritto tutto senza provare a compilare mai. Poi non so Scala che bestia sia (e nemmeno voglio saperlo).

Il nostro caso era diverso: il compilatore non dava errore, produceva regolarmente l’eseguibile che funzionava. Quasi. Dopo qualche giro è saltato fuori un risultato inaspettato, in una zona piuttosto piccola. Ripetendo il run questo risultato cambiava, sempre nella stessa zona ma l’ampiezza poteva variare. Naturalmente c’erano di mezzo matrici (array bidimensionali, credo si chiamino abitualmente così) decisamente grandi e il controllo facendo scrivere i valori erano di difficile valutazione. I test erano stati fatti su un caso di 6 x 6 (circa, non ricordo, cioè non vi dirò mai cose per cui posso essere incriminato) e era risultato tutto OK.

In questi casi io conosco un modo solo: esaminare il codice riga per riga. Non è ne veloce ne divertente.
Si era convenuto, contro la prassi corrente, di dichiarare tutte le variabili (mediante implicit none) e la prima verifica è stata di controllare i tipi: non è che c’è un integer al posto di un real? No, tutto OK. Però anche lì c’ modo e modo di farlo: posso scrivere

integer :: i1, i2, i3
real(8) :: r1, r2, r3

magari con nomi significativi ma, almeno per le variabili globali si dovrebbe scrivere

integer :: i1 ! descrizione della variabile
integer :: i2 ! descrizione della variabile
integer :: i3 ! descrizione della variabile

dividendole per gruppi. Poi si potrebbero creare strutture ma nel nostro caso non eravamo arrivati a tanto.

Uh! variabili globali, non è che… Sì sono tanto comode ma se si pasticcia nella definizione ne può scappare una (con il nome TL per noi) che resta lì addormentata. Se tenti di ridefinirla in una funzione ricevi un errore di ridifinizione. Ecco dev’essere successo quello, cancelli la seconda definizione pensando di averla fatta 2 volte nella stessa funzione. E userai la variabile globale, senza accorgertene.

OK, trovato l’errore basta rimuovere la variabile globale e ridefinirla localmente.
Tutto a posto? No! A differenza di qualche linguaggio la definizione di una variabile non setta la stessa a un valore predefinito, zero nel caso di interi. Mica siamo in Basic qui!
Ci sarebbero ancora altre cose, tipo se sia meglio un modulo (quello che permette di definire le variabili globali, e no solo) unico, grosso o tanti piccoli? E non dimenticare la direttiva private.

Forse è meglio una situazione come quella di Mark, certo che 996…

Poi va a finire che se la prendono con me! e mi retrocedono in serie B, come il Toro 😦

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: