2014-06-25 38 views
1

剛剛在Armadillo圖書館開始。通過文檔和FAQ,我沒有找到關於Armadillo如何處理錯誤的任何參考。例如,我應該如何知道「mat A(1e10,1e10)」是否成功?Armadillo庫如何處理錯誤?

+1

某些函數和構造函數拋出'std :: logic_error'作爲文檔狀態 – prajmus

回答

3

Armadillo的錯誤處理機制並不清楚它的文檔。通過與作者Sanderson的電子郵件溝通,發現Armadillo的錯誤處理機制實際上是C++ std異常和C風格返回值的混合體。但是,在文檔中,拋出什麼異常的信息仍然不完整。例如,要定義一個矩陣,我會建議不要使用「mat X(M,N)」,因爲沒有錯誤處理。安全的方法是這樣的(C風格):

mat X; 
    try{ 
     X.set_size(M, N); 
    } catch (...) { 
     printf("memory allocation failed\n"); 
     return -1; 
    } 

注意,當內存分配錯誤發生時,異常「的std :: logic_error」或「標準:: bad_alloc的」會被拋出(見下面的評論通過mtall),這不是放在文檔中。返回時,使用「X.reset()」釋放數據存儲器。

而@mtall:我建議對特定領域的新手較不苛刻的態度對社區健康更好。強迫他人閱讀不完整的文檔並不是一種建設性的意見。實際上,大多數優秀的開源項目都帶有不太好的文檔,這就是爲什麼我們應該幫助它們更加清晰和用戶友好的原因。

+0

'X.reset()'不需要釋放內存。只要'mat'對象超出範圍,C++就自動調用'mat'析構函數,它會自動釋放內存。 'X.reset()'只有在你想強制釋放內存時纔會使用。在正常使用中,它不是必需的。如果系統不能提供足夠的內存,'mat'會拋出'std :: bad_alloc'。查看'include/armadillo_bits/memory.hpp'中的代碼,其中使用'arma_check_bad_alloc()'函數。如果元素(行數*列)的數量太大而不能存儲在整數中,'mat'將只會拋出一個'std :: logic_error'。 – mtall

+0

如果您覺得某個開源項目涉嫌文檔不完整,歡迎您提交補丁到項目中以改進文檔。這比抱怨和不做功課更有成效。開源項目是在志願者的基礎上創建和維護的。 – mtall

+0

@mtall:感謝您的評論。這些完全從官方文檔中丟失。我建議,也許你可以用Armadillo總結你的經驗,並附上官方文檔 – Jedi

3

在對Stackoverflow提出問題之前,建議閱讀相關文檔。

從犰狳的documentation實例:

對於R = chol(X)chol(R, X)功能:如果分解失敗,R是復位和chol(X)拋出一個的std :: runtime_error例外,而chol(R,X)返回布爾設置爲

對於eig_sym(X)inv(X)功能:如果X不是方形,一個的std :: logic_error拋出異常。

對於像+這樣的運營商,std :: logic_error如果使用不兼容的對象大小,則會引發異常。

對於元素訪問如A(i,j)std :: logic_error如果請求的元素超出範圍,則會引發異常。

等等等等

的犰狳的源代碼也可以,這樣你就可以直接看它,看看它做什麼。