2012-04-01 7 views
2

Ich habe ein Programm mit Compaq Visual Fortran geschrieben. Das Programm ist in Ordnung und läuft in vielen Fällen korrekt. Der Fall arbeite ich an ist jetzt größer, mit größeren Eingabedatendateien und wenn ich das Programm Ich habe folgende Fehler ausgeführt:Stack Overflow mit Fortran

forrtl: severe(170): Program exception - stack overflow

Ich habe das editbin.exe Programm installiert, aber ich weiß wirklich nicht, wie man benutze es. Wenn

eingeben
editbin /STACK:4000000 DFDEV.exe 

es sagt mir, dass es nicht DFDEV.exe öffnen kann, auch wenn ich in das Verzeichnis bin dieses Programm enthält (C: \ Programme \ Microsoft Visual Studio \ Common \ MSDev98 \ BIN). Ich weiß wirklich nicht, wie ich dieses Problem lösen soll und in jedem Thema, das ich zu diesem Thema im Internet gefunden habe, gibt es keine Erklärung dafür, wie man dieses Editbin-Programm benutzt.

+0

Vielleicht müssen Sie bei der Ausführung von 'editbin' den vollständigen Pfad zu' DFDEV.exe' angeben. Wenn Sie einfach 'editbin' in die Befehlszeile eingeben, ohne eine andere Eingabe als die Befehlszeile, [erhalten Sie eine Verwendungsanweisung, die die Editbin-Optionen zusammenfasst] (http://msdn.microsoft.com/en-us/library/xd3shwhf % 28v = vs.80% 29.aspx). Wenn Sie jedoch nicht wissen, wie man mit editbin arbeitet, was bringt Sie zu der Annahme, dass es das richtige Werkzeug für die Aufgabe ist (das Debuggen Ihres Programmausnahmefehlers)? – Chris

+2

Wenn Ihr Problem darin besteht, dass Ihre Daten zu groß sind, um auf den Stapel zu passen, können Sie stattdessen die Zuweisung auf dem Heap in Betracht ziehen. –

+1

+1 zu @ DavidHeffernans Kommentar; Insbesondere bei älteren Fortran-Programmen, die keine dynamische Zuweisung verwenden, bedeutet Stack Overflow fast immer, dass große, statische Arrays in Subroutinen oder Funktionen zu groß geworden sind, um auf den Stack zu passen. Abhängig von Ihrem Betriebssystem gibt es Workarounds, oder Sie können Ihren Compiler dazu verleiten, große Arrays auf dem Heap zuzuordnen, aber das Beste von allem ist, dass Sie anfangen, auf solche großen statischen Arrays zu verzichten und diese stattdessen nach Bedarf zuzuweisen. –

Antwort

0

Ich fand auch den Compiler "Hilfe" nicht hilfreich. Das Programmierhandbuch bietet einige Wörter zur Stack- und Heap-Zuweisung, die über eine Suche nach "commit" gefunden werden können, mit Hinweisen, dass EDITBIN.EXE verwendet werden kann, um eine bereits kompilierte .exe-Datei zu ändern. Wie später erwähnt, gibt es auch die Compiler-Option Projekt> Einstellungen> Link> Ausgabe, die zu der Möglichkeit führt, größere Werte zu spezifizieren, aber wenig Anleitung für welche Werte. Es gibt eine Compiler-Option, die AUTOMATIC für die in Subroutinen deklarierte Speicherung annimmt. Einige Programme können sich jedoch darauf verlassen, dass Daten zwischen den Aufrufen "statisch" gespeichert werden und SAVE nicht sorgfältig spezifiziert wurde. Ich war vorsichtig mit SAVE und habe keinen Effekt mit "automatisch" ausgewählt. In meinem Fall kam es zu Problemen, nachdem ich eine kleine Rekursion eingeführt hatte (automatisch in Burroughs fortran - das RECURSIVE-Schlüsselwort ist otiose), aber Stack-Speicher wird auch für temporäre Variablen (möglicherweise Array-Größe) und Copy-In, Copy-Out-Parameter wie B. als Array-Abschnitte oder zum Beispiel als Übergabe eines Arrays vom Typ Blob, wobei Blob eine zusammengesetzte Entity ist, die beispielsweise eine Ganzzahl enthält, und Sie die Ganzzahlen als Array wie in A (i: j) .Fred, wo im Speicher darstellen möchten , aufeinanderfolgende Elemente von Fred sind nicht tatsächlich benachbart (mit Schritt = 1), da der Blob auch andere Elemente enthält.

Wie auch immer, ich fing an, zugewiesene Arrays zu verwenden (um zerlumpte Arrays anstelle von (bigenough, n) und dergleichen) und andere Änderungen und ich habe gerade überprüft und festgestellt, dass die Einstellung auf den Standardwert zurückgesetzt wurde (leerer Eintrag), zweifellos aufgrund von zwischenzeitlichen Neuinstallationen auf einem neuen Computer nach einem Stromausfall.