컴파일 타임에 지정되지 않은 D에서 정적 배열을 만드는 방법은 무엇입니까?컴파일 타임에 알 수없는 D에서 정적 배열 만들기
immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically
컴파일 타임에 지정되지 않은 D에서 정적 배열을 만드는 방법은 무엇입니까?컴파일 타임에 알 수없는 D에서 정적 배열 만들기
immutable ulong arrayLength = getArrayLength();
ubyte[arayLength]; // <- How to do this basically
짧은 답변 : 당신은하지 않습니다. 정적 배열의 크기는 컴파일 타임에 항상 알려져 있습니다. 런타임에 크기가 결정되는 배열을 원하면 동적 배열이어야합니다.
길게 대답 : 직접 요리를하고 싶다면 core.stdc.stdlib에있는 C의 alloca
을 사용할 수 있습니다. 그러나 당신이 정말로 필요로하지 않는 한 그런 종류의 일을 망칠 것을 조언하지는 않을 것입니다.
대안으로는 원하는 크기가 그보다 크지 않은 경우 사용하는 정적 배열을 사용하는 것이고, 더 큰 경우에는 동적 배열을 할당하는 것입니다. 원하는 경우 랩퍼 유형을 작성하여 처리 할 수도 있습니다. 여기가 개선 될 수 있다는 확신 간단한 일
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의 그러한 기능 (표준 라이브러리에있는 일종의 래퍼 유형을 얻을 수 있지만 여기에있는 예제와 비슷한 점이 있습니다).
이렇게하면 유형 [x]을 필요로하는 함수에서 배열을 사용할 수 있습니까? 여기서 x는 컴파일 타임에 알려진 숫자입니까? –
함수에 전달할 때 슬라이스하면 잘 작동합니다. –
@ JeroenBollen Adam이 말했듯이 슬라이스하면 슬라이스를 전달할 수 있습니다. 동적 배열을 사용하고 동적 배열의 내용을 정적 배열로 복사 할 수 있기 때문에 전달할 수 있지만 정적 배열이 보유 할 수있는만큼만 복사 할 수 있으므로 x가 동적 배열에있는 데이터 양보다 작은 경우 모든 데이터를 전달할 수 없습니다. –
내용을 변경할 수 없으므로 변경할 수 없습니다. –
"정적"이 의미하는 바를 설명하면 도움이됩니다. 좀 더 긴 모범을 보여줄 수 있습니까? – gmfawcett
@gmfawcett 크기를 수정할 수 없으며 비 동적 배열로 사용할 수 있습니다. –