Domanda

In MATLAB si può usare dbstack per recuperare lo stack di chiamate al momento attuale, tuttavia dbstack non è disponibile in standalone versioni dei programmi MATLAB compilato, c'è un'alternativa per ottenere lo stack di chiamate, o almeno la funzione di chiamata la corrente funzione? Voglio scrivere una funzione struttura che ha bisogno di sapere da chi è stato chiamato, ma uno stack completo chiamata sarebbe preferibile.

È stato utile?

Soluzione

Ecco dove le soluzioni stand finora:

  • Come lei ha ricordato, la funzione DBSTACK IS sulla di funzioni che non sono supportate da MATLAB Compiler , quindi non può essere utilizzato.
  • È anche menzionato in un commento che, anche se la funzione Evalin non è sulla lista delle funzioni non supportato il compilatore ancora non permetterà di usarlo. Che ha finito per rifiutare alcune delle soluzioni precedenti ho suggerito.
  • Dovendo mantenere il proprio stack passando argomenti lungo la catena di chiamate di funzione (o eventualmente memorizzandoli in una variabile globale ) non è una scelta ideale per la complessità ed extra lavoro che ci vuole per mantenere.

Tuttavia, ho ancora una possibile soluzione che secondo me è la più "pulita" ancora uno: utilizzando i meccanismi di gestione degli errori per arrivare alla traccia dello stack. Questo può variare in base alla versione di MATLAB si utilizza ...

Versioni MATLAB 7.5 (R2007b) e più recenti:

Le nuove funzionalità di gestione degli errori in forma di classe MException sono stati introdotto nel versione 7.5 . È possibile ottenere informazioni sulla traccia dello stack da oggetti MException creando e lanciando un'eccezione "fittizio", poi subito la cattura e l'accesso alla campo stack . Se fate quanto segue in una funzione:

try
  throw(MException('phony:error',''));
catch ME
  callerStack = {ME.stack.name};
end

Poi il callerStack array di celle conterrà i nomi di tutte le funzioni nello stack di chiamate, con il nome della funzione corrente nel primo elemento e il più a alto il nome del chiamante nel l'ultimo elemento.

Versioni MATLAB 7.1 (R14SP3) attraverso 7.4 (R2007a):

Per queste versioni precedenti è possibile utilizzare il ERROR per gettare una funzione UltimoErrore per errore e catturare l'errore e ottenere le informazioni di stack:

try
  error('phony:error','');
catch
  s = lasterror;
  callerStack = {s.stack.name};
end

Versioni MATLAB 7.0.4 (R14SP2) e versioni precedenti:

Purtroppo, la funzione UltimoErrore iniziato solo ritorno Analisi dello stack informazioni in MATLAB Versione 7.1 , quindi non esiste una versione delle soluzioni di cui sopra che posso venire con MATLAB per le versioni precedenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top