2013-03-27 63 views
4

我對x86使用DMD 2.062。Object.Error:打印std.algorithm.cartesianProduct的結果時發生訪問衝突

module test;  

private enum test1 
{ 
    one, 
    two, 
    three, 
} 

private enum test2 
{ 
    one, 
    two, 
    three, 
} 

auto ct = cartesianProduct([EnumMembers!test1], [EnumMembers!test2]); 

unittest 
{ 
    import std.stdio; 
    foreach (n, m; ct) 
    { 
     writeln(n, " ", m); 
    } 
} 

這個程序打印出:

one one 
two one 
three one 

然後訪問衝突引發錯誤。我是否錯誤地使用cartesianProduct,或者這是函數中的錯誤?

回答

6

這兩個微小的位,可能。這裏的問題是試圖在編譯時對ct進行評估,並生成在運行時使用的結果範圍。我猜CTFE或cartesianProduct不希望這種情況發生,而且會發生一些涉及使用無效內存的錯誤。我認爲它應該應該有工作,或者是編譯時錯誤,但這不會幫助你,並屬於錯誤跟蹤器。

這裏有什麼關係,但是如果將ct初始化移動到單元測試主體或static this()模塊構造函數,則所有內容都可以正常工作。你似乎錯過的是D在程序啓動時不支持初始化全局變量。分配給全局的值總是在編譯時進行評估,這通常是「正常工作」,通常會導致編譯時錯誤(如果初始化不是CTFE能夠的),並且在這種情況下導致奇怪的行爲:)

什麼你可能想是這樣的代碼:

auto Test1Members = [ EnumMembers!test1 ]; 
auto Test2Members = [ EnumMembers!test2 ]; 
alias CT = typeof(cartesianProduct(Test1Members, Test2Members)); 
CT ct; 

static this() 
{ 
    ct = cartesianProduct(Test1Members, Test2Members); 
} 

一般來說,編譯時數據和運行時的複雜類型數組或關聯數組數據之間的互連非常棘手當前d前端實現,需要大量的注意。

+0

已經提交http://d.puremagic.com/issues/show_bug.cgi?id=9822,會看到開發者說什麼。 – 2013-03-27 09:49:31

+0

@亞歷山大馬拉霍夫謝謝,修復。 – 2013-03-28 08:58:42