0

OpenGL 텍스처로 일부 데이터를 읽으려고 할 때 오류가 있습니다. 내 오류는 다음과 같습니다.관리 데이터를 glTexImage3D에 넣으려고 할 때 AccessViolationException이 발생했습니다.

A first chance exception of type 'System.AccessViolationException' occurred in libCoin3D.dll 

아래 기능에서 glTexImage3D 함수를 호출하면 이런 현상이 발생합니다. 그 함수를 주석 처리하면 프로그램은 정상적으로 실행되지만 함수에 전달 된 int 배열로부터 텍스처를 생성해야합니다.

GLuint TextureHandler::create3DTextureBonePreview(int* d, Vector3 length){ 
    GLuint bindLocation; 
    glGenTextures(1, &bindLocation); 


    static_cast<char*>(static_cast<void*>(d)); 

    int w=length.x; 
    int h=length.y; 
    int l=length.z; 
    glBindTexture(GL_TEXTURE_3D, bindLocation); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 


    glTexImage3D(GL_TEXTURE_3D, 0,GL_RGBA,w, h, l, 0,GL_RGBA, GL_UNSIGNED_BYTE,d); 
    printf("Done creating texture\n"); 

    return bindLocation; 
} 

내가 int * d에서 메모리를 처리하는 방법과 관련이 있다고 생각합니다. 이 데이터는 일부 C# 코드에서 일반 int 배열로 시작하여 곧 완료됩니다.

int[] allDatint=new int[dataSize]; 

그러나이 C에서 #

가 allDatint는 시스템 배열로 취하는 관리 C++ 생성자로 전달된다

CallbackNode::CallbackNode(int w ,int h, int l, array<int>^ d) 

그 생성자에이 전달되기 전에, * int로 변환되고 일부 관리되지 않는 C++ 코드는

cli::pin_ptr<int> pArrayElement = &d[0]; 
mCube=new MasterCube(w,h,l,pArrayElement); 

관리되지 않는 C의 ++는 INT *

로 받아

그리고 위의 함수에 전달하여 char 배열로 변환 한 다음 glTexImage3D에서 허용합니다. AccessViolationException는 'INT의 * 디부의 데이터가 glTexImage3D으로 사용할 손상 여부를했다고 생각 날 리드에 대해 내가 고개를 가지고있는

static_cast<char*>(static_cast<void*>(d)); 

. 누군가가 내가 array/systemArray/int */char * 사이에서 변환하는 방법에 문제가 있는지 말해 줄 수 있습니까? 아니면 그것을 이해하기 위해 단순히 잘못된 형식으로입니까?

답변

1

그리고 나서 위의 함수로 넘겨서 glTexImage3D가 받아들이도록 char 배열로 변환합니다.

static_cast<char*>(static_cast<void*>(d)); 

char *ptr 어디되는 주조 포인터에 할당하는 것입니다? 캐스트 문에 변수를 넣는 것은 변수를 "변환"하지 않습니다.

실제 문제는 표현식 w * h * l * 4의 값이 실제 배열의 크기를 바이트 단위로 초과한다는 것은 확실합니다. 거기에 알몸 포인터 만 있기 때문에 거기에 온 전성 검사를 추가하는 것은 불가능합니다.

+0

잡기 주셔서 고맙습니다. 배열 크기를 과장하여 그 오류가 발생한다는 것을 알지 못했습니다. 그래도 말이 되네. w, h, l에 대해 잘못된 값을 사용하고있는 것을 발견했습니다. – AAB

+0

원래 배열 배열이 w * h * l * 4 int로 작성되었는지 확인해도 여전히 'System.AccessViolationException'이 발생합니다. 동일한 정확한 숫자는 텍스처 생성 함수에서 바이트로 요청됩니다. 배열에 확실히 하나 이상의 int가 있어도 w = h = l = 1을 대입하면 문제가 발생합니다. 당신이 알고있는 또 다른 원인이 있습니까? char * ptr에 캐스트 값을 받도록 코드를 변경 한 다음 glTexImage3D에 매개 변수로 사용합니다. – AAB

관련 문제