2012-04-11 12 views
0

Ich schreibe ein Matlab-Skript, wo ich den Namen des Skripts wissen möchte, die eine Stufe im Stapel ist. Der Grund, warum ich das brauche, ist, dass ich ein Hilfsskript schreibe, das aufgerufen wird, um einige grundlegende Fakten über den Arbeitsbereich zu erhalten, bevor ich schwerere Berechnungen durchführe. Das Hilfsskript sollte beim Aufruf der Berechnungsskripte Fehlermeldungen ausgeben können.Name der Matlab-Datei eine Stufe im Stapel

Ich habe versucht mit mfilename und dbstack, aber ich bekomme nichts als den Namen des Hilfsskript von ihnen.

weiter zu erläutern, habe ich die folgenden Skripte:

  • verify_base_conditions: das Hilfsskript, in
  • auf einem der ersten Zeilen genannt
  • heavy_stuff_calculation und
  • sweet_mother_of_algorithms.
  • general_entry_point: ein Skript, wo ich sammle gemeinsamen Workflows in Zellen

Ich versuche, den Einstiegspunkt Skript so klein wie möglich zu halten, und Refactoring schwere Berechnungen (oder etwas, das mehr als ein paar Zeilen braucht, wirklich) in aufgabenbasierte, wiederverwendbare Skripte. Wenn ich von der Eintrittsstelle Skript, sweet_mother_of_algorithms nennen und die Rahmenbedingungen für dieses Skript auszuführen nicht erfüllt ist, möchte ich eine Fehlermeldung sehen, wie

Error: this_cool_var must be defined when running sweet_mother_of_algorithms 
general_entry_point line 15 

ich versuchte, mit

error(['this_cool_var must be defined when running ' mdfilename]) 

und andere ähnliche Konstrukte, aber ich konnte die Fehlermeldung nichts anderes als verify_base_conditions sagen.

Wie finde ich den Namen des Skripts, das eine Ebene höher im Stapel ausgeführt wird?

. (Anmerkung: Ich bin nicht interessiert sich für das Skript an der unteren des Stapels laufen zu finden - die fast immer general_entry_point sein wird, ich bin nur daran interessiert, den Namen des Skripts in erhalten, die verify_base_conditions genannt .)

Antwort

1

dbstack sollte dafür arbeiten. Ich denke, dies ist ein analoges Set-up zu verkaufen:

a.m: 
    b; 

b.m: 
    c; 

c.m: 
    stack = dbstack; 
    for i=1:3 
    disp(stack(i)); 
    end 

Als ich a; laufen, das den ganzen Stapel druckt, einschließlich b (was ich glaube, es sind Sie wollen - die zweit Top-Artikel auf dem Anruf . stapeln

Alternativ kann, obwohl dies wahrscheinlich genau das gleiche Ergebnis liefert, könnten Sie werfen und einen Fehler fangen und an seinem Stack aussehen:

c.m: 
    try 
    error('What is on the call stack?'); 
    catch e 
    for i=1:3 
     disp(e.stack(i)); 
    end 
    end 
+0

tatsächlich ich bin überrascht, dass Ihre 'Fehler ([... mdfilename]) 'code druckt nur verify_base_conditions. Fehler norma Ich drucke den gesamten Call-Stack aus. – Richante

+0

Ich bekomme den gesamten Call-Stack, wenn ich die gesamte Datei ausführen (z. B. durch Drücken von F5), aber nicht, wenn ich nur eine Zelle ausführen. Was ich normalerweise mache ... –

+0

...aber jetzt, aus irgendeinem Grund, völlig jenseits meines Verständnisses, fing es plötzlich an zu arbeiten. Ich benutze deinen ersten Vorschlag, und es funktioniert wie ein Zauber! –