Lokale Variablen in einer Funktion oder Unterprogramm (einschließlich der Absenderadresse) lösen sollte eine neue Kopie sein, wenn sie aufgerufen wird.
Normalerweise wird dies mit einer Stack-Architektur gemacht. Immer wenn eine Funktion aufgerufen wird, werden ihre Argumente auf den Stapel geschoben, dann wird ihre Rückkehradresse gedrückt, dann wird auch ein Speicherblock "gedrückt" (indem der Stapelzeiger um einen ausreichenden Betrag dekrementiert wird). Ein spezielles Register, der "frame pointer", wird auf diesen Speicher gerichtet, und die Funktion bezieht sich auf alle ihre lokalen Variablen mit Bezug auf dieses Register.
Andere Sprachen verwenden keinen physischen Hardwarestapel, sondern einen logischen, der als verkettete Liste implementiert ist, aber das Prinzip ist dasselbe.
Da das ursprüngliche Fortrans dieses Konzept nicht hatte und alle Variablen an festen globalen Orten speicherte, würde ein rekursiver Aufruf abstürzen oder hängen. Wenn A zum Beispiel B Anrufe C Anrufe B anruft, dann kehrt B zu C zurück, das zu B zurückkehrt, das ad infinitum zu C zurückkehrt, weil B sich nur an eine Absenderadresse erinnern kann.
calls: A -> B -> C -> B
returns: B <- C <- B
B -> C
Was mehr ist, werden alle lokalen Variablen und Argumente der erste Aufruf von B clobbered werden, wenn der zweite Aufruf von B auftritt.
Einverstanden, willkommen zu scicomp und danke für die Frage. Um alles zu wiederholen, was Deer Hunter gesagt hat, haben wir viele Fortran-Benutzer in dieser Community, aber im Allgemeinen behandeln wir allgemeine Programmierfragen wie diese nicht. Ich werde dieses zu StackOverflow überführen. –
Ok ich habe es. Danke für den Umzug –
Ich denke, das einzige, was Sie brauchen, sind: Funktionen und lokale Variable und Argument Speicherplatz pro Funktionsaufruf. Zeigen a. In Ihrer Frage scheint zu vermuten, dass der Speicherplatz über Funktionsaufrufe hinweg wiederverwendet wird. – jackrabbit