문제

나는 (알 수없는 순위의) 정수에 대한 다단계 포인터 배열을 가지고 있습니다.

    public unsafe static void MyMethod(Array source, ...)
    {
         //...
    }

다차원 포인터 배열 포인터는 방법 외부에 구성되어 있으며 전달됩니다. 예는 다음과 같습니다.

int*[,,,] testArray = new int*[10,10,5,5];

MyMethod(testArray);

배열에서 런타임 컴퓨팅 인덱스에서 값을 설정하려면 어떻게해야합니까? Array.setValue (...)는 비 포인터 어레이에 완벽하게 잘 작동하지만 int* 배열 작업을 거부합니다. 반사판을 사용하여 SetValue가 값에 대한 객체를 가져 오는 InternalSetValue를 호출하는 것으로 줄어드는 것을 볼 수 있지만 외부로 표시되어 있으며 구현을 볼 수 없습니다. 나는 어둠 속에서 총을 맞았고 박스형 포인터를 통과하려고했지만 운이 없었다.

도움이 되었습니까?

해결책

이것은 작동합니다 :

unsafe static void MyMethod(int** array)
{
    array[10] = (int*)0xdeadbeef;
}

private static unsafe void Main()
{
    int*[, , ,] array = new int*[10, 10, 10, 10];

    fixed (int** ptr = array)
    {
        MyMethod(ptr);
    }

    int* x = array[0, 0, 1, 0]; // == 0xdeadbeef
}

그게 도움이 되나요?


전문가에게 질문 : 배열이 메모리에 연속적으로 할당되었다고 가정하는 것은 잘못된가요?

다른 팁

.NET에서 포인터를 상자에 넣을 수 없기 때문에 이것은 작동하지 않으므로 절대 호출 할 수 없습니다. Array.SetValue 그리고 통과합니다 int*.

당신은 선언 할 수 있습니까? MyMethod 받아들이려면 int*[,,,] 대신에?

편집하다: 추가 읽기를 위해 Eric Lippert의 흥미로운 최근 게시물.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top