在D中创建编译时未知的静态数组

在D中创建编译时未知的静态数组,d,dynamic-arrays,D,Dynamic Arrays,如何在D中创建一个静态数组,编译时没有指定该数组的大小 immutable ulong arrayLength = getArrayLength(); ubyte[arayLength]; // <- How to do this basically 不可变ulong arrayLength=getArrayLength(); ubyte[arayLength];// 简单回答:你没有。静态数组的大小在编译时总是已知的。如果需要在运行时确定大小的数组,那么它需要是动态数组 更详细的回答:

如何在D中创建一个静态数组,编译时没有指定该数组的大小

immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically
不可变ulong arrayLength=getArrayLength();
ubyte[arayLength];// 简单回答:你没有。静态数组的大小在编译时总是已知的。如果需要在运行时确定大小的数组,那么它需要是动态数组

更详细的回答:如果你想自己制作一些东西,你可以使用C语言,可以在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;
}
struct StaticArray(T,size\T defaultLen=10)
{
公众:
这(尺寸和长度)
{

if(length immutable)在这里不起作用,因为您无法更改内容。如果您解释一下“静态”的含义,这会有所帮助。您能举一个更长的例子吗?@gmfawcett它不能修改大小,可以用作非动态数组。这允许在需要[x]类型的函数中使用数组吗,其中x是编译时已知的数字?如果在传递给函数时对其进行切片,则会起作用。@JeroenBollen如Adam所说,如果对其进行切片,则可以传递它,因为这样您将使用动态数组,并且可以将动态数组的内容复制到静态数组,但您必须记住,只能复制尽可能多的内容静态数组可以容纳,因此如果x小于动态数组中的数据量,则无法传递所有数据。IMHO,标准(ISO)C扩展,如alloca,应该在单独的模块中,而不是在
core.stdc.stdlib
中。也许这应该在D新闻组中讨论……是的,alloca()在几乎所有主要的C运行时库中都有,但它既不是标准的C函数,也不是POSIX函数。