2014-11-23 1 views
0
char buffer[1024]; 

memset(buffer, 0, sizeof(buffer)); 
FILE *vertexShaderFile = fopen(vertexShaderPath.c_str(), "rb"); 
fread(buffer, 1, sizeof(buffer) - 1, vertexShaderFile); 
fclose(vertexShaderFile); 

GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, 1, (const char **)&buffer, nullptr); 
glCompileShader(vertexShader); 

이 코드를 사용하면 glShaderSource()을 호출 할 때 세그먼트 오류가 발생합니다. GDB를 사용하여 buffer (쉐이더 코드)의 내용이 Null로 종료되었음을 확인했습니다. 여기에 GLEW_ARB_shader_objectsglShaderSource이 모두로드되었는지 확인했습니다.glShaderSource()의 분할 오류

여기에 무슨 일이 일어날 수 있습니까?


몇 가지 땜질 후 나는 그것을에서 std::string을하고 c_str()에 의해 반환 된 포인터에 대한 포인터 glShaderSource()를 전달하여 힙, 즉에 buffer의 복사본을 만들 경우, 그것이 작동하는 것을 발견했습니다.

이제는 더 혼란 스럽습니다. 나는 단순히 bufferchar * 포인팅을 선언하고 그에 통과하는 경우에도이 위에


, 그것은 작동합니다. 포인터에 대한 포인터 대 포인터에 대한 포인터를 선언 할 때 C++ 11은 특별한 것을합니까?

답변

2

당신은 잘못 C 구문을 사용하고 있습니다 :

char buffer[1024]; 
... 
glShaderSource(..., (const char **)&buffer, ...); 

하지 실제 문자열 데이터에 대한 포인터에 대한 포인터입니다. 정의에 따라 &bufferbuffer과 같습니다. 즉, 인 char의 포인터 buffer입니다. 다른 것을 캐스팅하면 오류가 숨겨집니다.

이 구성물 은 원칙적으로에서 작동하지 않습니다. 해당 버퍼의 주소를 보유하는 명시 적 변수가 없으면 컴파일러는 컴파일시에 buffer에 대한 액세스를이 경우 스택의 메모리 위치로 직접 변환합니다. 일반적인 신화와 반대로 배열은 이 아니며은 C/C++의 포인터와 동일입니다. 배열의 이름은 첫 번째 객체에 대한 포인터 값으로 평가되지만, 이는 동일한 것은 아닙니다. 당신이해야 할 일은 즉각적인 가치의 주소를 취하는 것과 개념적으로 동일합니다 : &12345. 처음에는 존재하지 않는 무언가의 주소를 결코 얻을 수 없습니다.

char buffer[1024]; 
char *pBuffer=buffer; 
... 
glShaderSource(..., &pBuffer, ...); 

지금, 당신은 실제로 버퍼의 주소를 보유하고 메모리에 대한 포인터를 가지고 : 물론 당신이 할 수있는 일

하나를 만드는 것입니다. 물론 포인터 변수의 주소를 가져 와서 char ** 유형의 표현식을 얻을 수 있습니다.

+0

이것은 내가 끝내었지만, 자세한 설명에 큰 감사드립니다! – jmegaffin