2013-02-01 24 views
5

का उपयोग करना है, मैं लिखने/डिबगिंग फ़ंक्शंस के दौरान ब्रेक पॉइंट्स के बजाय cell mode का उपयोग करना चाहता हूं।यह निर्धारित करने के लिए कि कोड को फ़ंक्शन के रूप में निष्पादित किया जा रहा है या सेल मोड

वर्तमान में निष्पादन कोड को फ़ंक्शन के रूप में निष्पादित करने या सेल मोड का उपयोग करने पर आप रन-टाइम पर कैसे निर्धारित करेंगे?

बोनस अंक यदि आप function के साथ आ सकते हैं जो जानता है कि इसे किसी अन्य फ़ंक्शन या सेल से शामिल किया गया है।

जब यह उपयोगी हो सकता है तो इसका एक उदाहरण यह है कि जब आप फ़ंक्शन निष्पादन के दौरान अलग-अलग डेटा लोड करना चाहते हैं या यदि आप डिबगिंग के लिए प्लॉटर्स बनाना चाहते हैं। सेल या फ़ंक्शन के रूप में निष्पादित करने के बीच स्विच करते समय विशिष्ट लाइनों पर टिप्पणी करना दर्द होता है।

function doSomethingAwesome(inputs) 
%% 

if executingAsCell == true 
    clear 
    importData 
end 


% process stuff 

if executingAsCell == true 
    plot(myAwesomeResults) 
end 

ध्यान दें, यह मेरे पिछले सवाल का डुप्लिकेट नहीं है:How to determine if code is executing as a script or function?

+0

+1 दिलचस्प सवाल। पहला विचार (बदसूरत हैक): डमी वैरिएबल को आपके फ़ंक्शन/स्क्रिप्ट में पहली चीज के रूप में परिभाषित करने के बारे में और बाद में जांचें कि क्या यह परिभाषित किया गया है? – user1884905

+3

आप इसे [dbstack] (http://www.mathworks.nl/help/matlab/ref/dbstack.html) के साथ ऐसा करने में सक्षम हो सकते हैं, सुनिश्चित नहीं है। – Junuxx

उत्तर

2

सरल दृष्टिकोण dbstack() उपयोग कर रहा है के रूप में @Junuxx ने सुझाव दिया:

if isempty(dbstack) 
    %# true if you evaluated the cell while not in debug mode 

इसी तरह, एक समारोह कर सकते हैं पता है कि इसे किसी अन्य फ़ंक्शन या बेस/सेल से dbstack

की लंबाई की जांच करके लागू किया गया था या नहीं
function doSomething 
    if length(dbstack)==1 
     %# the function has been invoked from a cell or the command line 
     %# (unless you're in debug mode) 

एक समारोह वास्तव में, भेद कर सकते हैं कि क्या यह कमांड लाइन से या एक सेल से लागू किया गया था के बाद से बाद के इतिहास में लिख नहीं करता है:

function doSomething 

    if length(dbstack)==1 
     javaHistory=com.mathworks.mlservices.MLCommandHistoryServices.getSessionHistory; 
     lastCommand = javaHistory(end).toCharArray'; % ' added for SO code highlighting 
     if strfind(lastCommand,'doSomething') 
     %# Probably invoked via command line 
     else 
     %# Probably invoked via executing a cell 

आप यह निर्धारित करने के लिए आप कर रहे हैं कि क्या चाहते हैं डीबग मोड में या नहीं, एक संभावना line का उपयोग करना है - डीबीस्टैक से अंश, और जांच करें कि स्पष्ट कॉलिंग फ़ंक्शन पर वर्तमान में निष्पादित फ़ंक्शन पर कॉल है या नहीं।

+0

@ स्लेटन: संपादन के लिए धन्यवाद। चूंकि मैं एमरो द्वारा प्रदान की गई यूस्क्रिप्ट का उपयोग करता हूं (टैग विकी देखें), मेरे पास अब कोड को हाइलाइट करने वाले कोड नहीं हैं – Jonas

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^