2014-02-28 136 views
0

IML模塊中的嵌套範圍如何工作?IML模塊中的嵌套範圍

我正在嘗試創建一個優化模塊。它包含其他模塊。由於IML中的優化功能如何工作,因此內部模塊需要訪問本地範圍外部模塊。

這就是我想要工作。

start mvo_cvar(m,s,ub,lb,st); 

    start C_VAR(x) global(s, st); 
     r = st - x*s*x`; 
     return (r); 
    finish C_VAR; 

    start F_RETURN(x) global(m); 
     r = m`*x`; 
     return (r); 
    finish F_RETURN; 

    nvar = nrow(s); 
    ones = J(1,nvar,1); 
    ubound = ones*ub; 
    lbound = ones*lb; 
    con = (lbound || {. .}) // 
      (ubound|| {. .}) // 
      (ones || {0 1}); 

    optn = j(1,11,0); 
    optn[1] = 1; 
    optn[2] = 0; 
    optn[10] = 1; 
    optn[11] = 1; 
    x = J(1,nvar,0); 
    x[1]=1; 

    call nlpqn(rc,results,"F_RETURN",x,optn,con) nlc="C_VAR"; 

    return (results); 
finish mvo_cvar; 

然而,F_RETURN和C_VAR模塊不能找到sst,或m矩陣。我得到

ERROR: (execution) Matrix has not been set to a value. 

operation : ` at line 6948 column 14 
operands : m 

m  0 row  0 col  (type ?, size 0) 


statement : ASSIGN at line 6948 column 9 
traceback : module F_RETURN at line 6948 column 9 
      module MVO_CVAR at line 6940 column 1 

例如。

有沒有辦法引用外部模塊的本地作用域?

回答

2

有沒有這樣的事情作爲本地模塊或嵌套模塊。所有模塊都是全球知名的。請參閱文檔 http://support.sas.com/documentation/cdl/en/imlug/66112/HTML/default/viewer.htm#imlug_programstatements_sect023.htm

變量m,s和st對於mvo_cvar模塊是本地的。爲了讓其他模塊可以訪問它們,它們都需要具有相同的全局名稱。我喜歡用「g_」作爲我的全局變量的前綴。 所以代碼可能看起來像這樣:

start mvo_cvar(m,s,ub,lb,st) global(g_m, g_s, g_st); 
    g_m = m; g_s=s; g_st = st; /* assign shared global vars */ 

    nvar = nrow(s); 
    ones = J(1,nvar,1); 
... 
    call nlpqn(rc,results,"F_RETURN",x,optn,con) nlc="C_VAR"; 

    return (results); 
finish mvo_cvar; 

start C_VAR(x) global(g_s, g_st); 
    r = g_st - x*g_s*x`; 
    return (r); 
finish C_VAR; 

start F_RETURN(x) global(g_m); 
    r = g_m`*x`; 
    return (r); 
finish F_RETURN; 
+0

謝謝。不完全是我所希望的答案。我將不得不使用宏來執行此操作,因爲這些全局變量的名稱會發生​​更改,並且在運行時間之前不會知道。 – DomPazz

+0

當你打算使用它們時,你肯定知道變量的名字。 JUst定義了一個名爲SetGlobal()的模塊,用於從您想要使用的任何局部變量中分配全局變量。 – Rick