Argomenti passati a funzione

pr1meL’altro giorno ero alle prese con la filosofia della programmazione funzionale, cosa di moda ultimamente ma –scopro– vecchia ormai. E mi è tornato in mente un caso di tento tempo fa; quasi-quasi lo racconto. Anzi vado, così verifico se nel frattempo i compilatori sono migliorati. E pensa te che ho dovuto reinstallare il Fortran. Dai c’è di peggio. Per esempio la politica. Il caso è molto semplice. Pochissime righe di codice, antico; qui uso il 77 ma andrebbe bene anche il IV (1966). L’unica cosa da tener presente è che gli argomenti a una funzione sono sempre passati per indirizzo (reference). Quindi quanto si torna dalla chiamata se le variabili usate come parametri sono state modificate risulteranno modificate. Mi prendo una piccola libertà per semplificare il problema: i programmatori allora prediligevano di gran lunga le subroutine, sottoprogrammi che non ritornano esplicitamente un valore ma si affidano ai side effects; invece qui uso una function, quelle del C, c’erano da sempre anche in Fortran. Creo una piccolissima (e ridondante per visualizzare il caso in oggetto) funzione quad() che ritorna il quadrato dell’argomento che le viene passato (quad.f):

1
2
3
4
5
6
7
* quad restituisce il quadrato del parametro
       function quad(x)
       
       x = x * x
       quad = x
       
       end

Iessainou! pessima. Se uno programma così lo licenzio a calcinculo. CMQ, la prima riga è un commento, la quinta specifica il valore da ritornare, calcolata nella riga precedente, inutile, anzi dannosa. Inutile in quanto il calcolo poteva farlo sulla stessa riga che definisce il valore della funzione. Questa funzione può essere chiamata da un main, così (bug1.f):

1
2
3
4
5
6
      x = 5
      print *, 'calcolo il quadrato di X, con X =', x
      qx = quad(x)
      print *, ' il quadrato di', x, ' vale ', qx
      
      end 

Compilo ed eseguo: bug1 Oops! anzi atz! 👿 Ma lo sapevo, x è stata modificata nella funzione. C’era (e forse c’è ancora) di peggio, consideriamo questo caso (bug2.f):

1
2
3
4
5
6
      x = 5
      print *, 'calcolo il quadrato di X, con X =', x
      qx = quad(5)
      print *, ' il quadrato di', x, ' vale ', qx
      
      end 

Compilo, quad è già compilata, devo solo linkarla, risparmio tempo, i vecchi a queste cose erano attenti 😉 ed eseguo: bug2 OK, ecco. Come previsto. A questo punto via con il debug. Cioè no, anzi tutto come previsto. Ma allora… 👿

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • Piero Patteri  Il 4 aprile 2015 alle 21:18

    Io la conoscevo in modo leggermente diverso: l’argomento è passato per indirizzo se è un array, mentre è passato per valore se è una costante (ovvio…) o uno scalare, tanto che per passare un vettore di n elementi VECT(N) si scriveva semplicemente VECT(1) tanto nella subroutine l’importante era avere l’indirizzo del primo elemento.
    Ma non sono affatto convinto che i compilatori che usavo io su IBM 370 mi avrebbero lasciato passare x = x * x .

    • juhan  Il 5 aprile 2015 alle 01:11

      IBM faceva a modo suo, e cambiava nel tempo. Si potrebbe sviluppare storicamente gli aneddoti.
      In ogni caso l’istruzione x = x * x presa singolarmente è corretta, il problema è altrove. O no?

Trackback

  • […] so se solo noi… (inteso come quelli con cui lavoravo illo tempore) ma in seguito al post Argomenti passati a funzione ho avuto una sessione di ricordi con il mio boss di allora. […]

Rispondi

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

Logo di 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: