2

如何创建支持任何大小的静态数组的函数?

就像是:

@safe pure nothrow void fillArray(ref ubyte[] array) {
    /**
     * How do I make this function support arrays of any
     * size; but they don't have to be dynamic?
    **/
}
4

2 回答 2

5

棘轮怪胎在评论中说,但我也会把它作为答案。解决方案是只使用常规切片:

void fillArray(ubyte[] array) {}

然后可以毫不费力地将静态数组传递给它,当然,您仍然可以对它们进行切片以仅将一部分传递给它。

int[4] foo;
fillArray(foo); // ok, passes the whole thing
fillArray(foo[0 .. 2]); // passes only the first two

如果您附加到 fillArray 中的切片,这可能会破坏事情,因为附加到切片会重新分配它 - 因为它不是 ref,您可以更改内容,但不能更改地址或长度。将切片视为指针+长度对:

void fillArray(ubyte* data, size_t length) {}

您可以更改 *data 或 data[0]、data[1] 等,填充内容,但如果您更改长度或指针本身,则不会在函数外部看到,除非 ref 当然,就像更改函数中的任何其他 int 值一样。

而且您不能通过 ref 来调整静态数组的大小,因为无论如何调整静态数组的大小都是不可能的!

于 2013-11-23T20:57:11.237 回答
3

你需要做的是ref从你的论点中删除。当您使用引用时,这意味着当您在函数内部调整数组大小时,它也会在函数外部调整大小,这显然是静态数组无法实现的。

不使用ref时,仍然可以编辑数组内容。但是,当您调整数组大小时,只有数组指针的本地副本会更新为新长度。本地副本将具有不同的大小;原始指针仍将具有原始大小。

如果你对数组进行切片,它也可以工作,因为函数获得的引用无论如何都是对该数组切片的新引用;它不等于原始参考。

于 2013-11-23T21:01:07.687 回答