2013-11-22 37 views
1

如何在D中創建一個靜態數組,其大小在編譯時沒有指定?在D中創建一個在編譯時不知道的靜態數組

immutable ulong arrayLength = getArrayLength(); 
ubyte[arayLength]; // <- How to do this basically 
+1

不可變將不會在那裏工作,因爲您將無法更改內容 –

+0

如果您解釋「靜態」的含義,這將有所幫助。你能舉一個更長的例子嗎? – gmfawcett

+0

@gmfawcett它不能修改大小,並且可以用作非動態數組。 –

回答

4

簡短的回答:你不知道。靜態數組的大小在編譯時總是已知的。如果你想要一個大小在運行時確定的數組,那麼它需要是一個動態數組。

較長的答案:如果你想自己煮點東西,你可以使用C的alloca,可以在core.stdc.stdlib找到。但除非你真的需要,否則我不會建議這樣的事情。

另一種方法是使用靜態數組,如果所需的大小不超過該大小,並且如果它最終變大,則分配一個動態數組。你甚至可以創建包裝類型來處理它,如果你想。這裏有一個簡單的

struct StaticArray(T, size_t defaultLen = 10) 
{ 
public: 

    this(size_t length) 
    { 
     if(length <= _staticArr.length) 
      _arr = _staticArr[0 .. length]; 
     else 
      _arr = new T[](length); 
    } 

    inout(T)[] opSlice() inout pure nothrow 
    { 
     return _arr; 
    } 

    inout(T)[] opSlice(size_t i, size_t j) inout pure nothrow 
    { 
     return _arr[i .. j]; 
    } 

    inout(T) opIndex(size_t i) inout pure nothrow 
    { 
     return _arr[i]; 
    } 

    @property size_t length() @safe const pure nothrow 
    { 
     return _arr.length; 
    } 

private: 

    T[defaultLen] _staticArr; 
    T[] _arr; 
} 

我敢肯定,可以改進,但它提供了一種方法的一個例子,以試圖避免動態分配的數組,當你不知道提前多少個元素你陣列將需要。

長度在運行時確定的靜態數組主題最近是discussed in the D newsgroup,而語言的創建者Walter Bright認爲它們比它們的價值更麻煩,所以我不希望看到它D中的這樣一個特性(雖然我們可能會在標準庫中得到某種類型的包裝類型,它與我在這裏的例子類似)。

+0

這是否允許在需要類型[x]的函數中使用數組,其中x是編譯時已知的數字? –

+1

如果在傳遞給函數時切片,那將起作用。 –

+0

@JeroenBollen正如亞當所說,如果你切片,那麼你可以傳遞它,因爲那樣你就會使用動態數組,並且你可以將動態數組的內容複製到靜態數組中,但是你必須保留記住你只能複製和靜態數組一樣多的數據,所以如果x小於動態數組中的數據量,那麼你將無法傳遞所有數據。 –

相關問題