2016-12-24 91 views
2

我正在嘗試在我的八度環境中使用名爲optprop的matlab模塊。看起來代碼有一些兼容性問題。特別是,當我嘗試調用嵌套函數在八度/ matlab中看不到局部變量

xyz_image = rgb2xyz(rgb_image) 

我獲得以下錯誤:

error: 'cwf' undefined near line 1809 column 15 
error: called from 
    astm>getcwf at line 1809 column 4 
    astm at line 1843 column 5 
    makecwf>tryastm at line 74 column 5 
    makecwf at line 59 column 9 
    wpt at line 33 column 6 
    i_xyz2xyz at line 28 column 6 
    i_rgb2xyz at line 54 column 5 
    optproc at line 315 column 7 
    rgb2xyz at line 49 column 33 
    rgb2xyz_norm2 at line 10 column 12 

導致錯誤是在astm.m文件中的代碼。此文件定義功能:從我的角度一切都很好這裏點

function z=astm(op,varargin) 
    persistent cwf lam 
    %cwf initialization 

    %nested function 
    function z=getcwf(name, varargin) 
     %... 
     z=cwf; %here cwf is undefined 
     %... 

    %actual nested function call 
    z=getcwf(varargin{:}); 
    %... 

。嵌套函數應該看到cwf。即使我使用八度,它應該支持一切,因爲optprop包在2007年上次更新。我也試過嵌套函數,下面的代碼工作得很好:

function nested_function_test() 
    disp('inside outer function'); 
    local_variable = 'local string content'; 

    function nested_function() 
     disp('inside nested function'); 
     disp(local_variable); 
    end 

    disp('after nested function declaration'); 
    nested_function(); 
end 

我沒有看到這些代碼塊之間的任何區別。爲什麼cwf未定義?

更新:

爲了以防萬一。目前的解決方法,適用於我:

function z=getcwf(name, varargin) 
    cwf = varargin{end - 1}; 
    lam = varargin{end}; 
    %... 


varargin{end + 1} = cwf; 
varargin{end + 1} = lam; 
z=getcwf(varargin{:}); 
+0

不知道這是你的情況,在所有相關的,但是倍頻特別是偶然在會話重新啓動之前,無法「看到」更改。例如。看[這個錯誤](https://savannah.gnu.org/bugs/?46282)。我還親眼目睹了這種行爲,編輯內置函數和其他場景。另外,雖然八度支持嵌套功能,但某些功能仍然缺失。如果在重新啓動八度音程時問題仍然存在,以及它是否也存在於matlab中(如果有權訪問它)將會很有用。 –

+0

謝謝,塔索斯,但似乎並非如此。問題仍然存在好幾天,所以會話重啓不起作用。至於功能支持,我相信八度應該已經完全支持嵌套功能。我附上了工作示例,並且我沒有看到我嘗試運行的模塊與我提供的此MWE之間有任何區別。 – Roman

回答

3

這似乎是一個八度的明確錯誤。在你的MWE中,如果你讓local_variable持久,那麼馬車行爲將被複制。即

function nested_function_test() 
    disp('inside outer function'); 
    persistent local_variable; % <-- change here, make local_variable persistent 
    local_variable = 'local string content'; 

    function nested_function() 
    disp('inside nested function'); 
    disp(local_variable); % <-- local_variable no longer visible 
    end 

    disp('after nested function declaration'); 
    nested_function(); 
end 

以上將在matlab中工作,並失敗八度。

特別是,在matlab中,在嵌套函數內的調試會話期間,如果您鍵入whos,您將看到兩個變量堆棧,一個(空的)工作空間位於嵌套函數本地,另一個對應於外部函數,嵌套的內部函數可以訪問的對象包含持久變量。

在八度中,在嵌套函數內輸入whos只會返回一個空的本地工作空間,而不是其他任何東西。 (如果你刪除了persistent行,你會發現八度只是將外部局部變量「導入」到本地工作空間,而不是訪問內部和外部,所以似乎八度音程有不同的方法來處理它創建嵌套函數)。

我會鼓勵你提交本作中octave bug tracker 正式的錯誤。看起來,也許開發人員將持久變量視爲一種特殊情況,並忘記在其嵌套函數的特定實現中解釋這種行爲。據推測,「導入」步驟會查看某個特定地點的變量,並將該變量存儲在其他地方並錯過?


1:啊,看來這個bug已經被報道和證實,但尚未確定:https://savannah.gnu.org/bugs/index.php?42126

+0

(更新:bug報告已經在開發分支修復;請參閱bug跟蹤器,我還沒有證實) –