variabili locali in una funzione o una subroutine (compreso il suo indirizzo di ritorno) dovrebbe essere una nuova copia ogni volta che viene chiamato.
Di solito questo viene fatto utilizzando un'architettura stack. Ogni volta che viene chiamata una funzione, i suoi argomenti vengono inseriti nello stack, quindi viene inviato il suo indirizzo di ritorno, quindi viene anche "spinto" un blocco di memoria (diminuendo il puntatore dello stack di una quantità sufficiente). Un registro speciale, il "puntatore del frame" viene impostato puntando a quella memoria e la funzione fa riferimento a tutte le sue variabili locali facendo riferimento a quel registro.
Altri linguaggi non utilizzano uno stack hardware fisico, ma uno logico implementato come elenco collegato, ma il principio è lo stesso.
Poiché i Fortrans originali non disponevano di questo concetto e memorizzavano tutte le variabili in posizioni globali fisse, una chiamata ricorsiva si bloccava o si bloccava. Ad esempio, se A chiama B chiama C chiama B, quindi B ritorna a C, che ritorna a B, che ritorna a C, all'infinito, perché B può ricordare solo un indirizzo di ritorno.
calls: A -> B -> C -> B
returns: B <- C <- B
B -> C
Cosa c'è di più, tutte le variabili e gli argomenti della prima chiamata a B locali sono rovinati quando si verifica la seconda chiamata a B.
fonte
2013-02-05 16:21:52
Concordato, benvenuto a scicomp e grazie per la domanda. Solo per fare eco a tutto ciò che ha detto Deer Hunter, abbiamo un sacco di utenti Fortran in questa comunità, ma generalmente non gestiamo domande di programmazione generale come questa. Ho intenzione di spostare questo su StackOverflow. –
Ok ho capito. Grazie per il passaggio –
Immagino che l'unica cosa di cui hai bisogno sono: funzioni e spazio di memoria locale e argomento per invocazione di funzione. Punto a. nella tua domanda sembra suggerire che lo spazio di archiviazione sia riutilizzato attraverso le chiamate di funzioni. – jackrabbit