2015-06-12 1 views
-2

мое маленькое приложение OpenGL прекрасно работает в режиме отладки, но если я построю его в режиме выпуска, я часто получаю эту ошибку:программа OpenGL работает только в режиме отладки в Visual Studio 2013

Shader Creation Error: 
- Vertex shader failed to compile with the following errors: 
ERROR: 0:22: error(#132) Syntax error: "]" parse error 
ERROR: error(#273) 1 compilation errors. No code generateder code here 

Странная вещь, что ошибка происходит большую часть времени, но иногда программа работает нормально. Я думаю, что это имеет какое-то отношение к филе, но я не могу понять, что это такое.

Это соответствующая часть моего кода:

std::ifstream file(fp); 
    if(!file) crit_error("Shader Loading", ("file "+fp+" doesn't exist").c_str()); 

    file.seekg(0, file.end); 
    GLint len = GLint(file.tellg()); 
    file.seekg(0, file.beg); 

    GLchar* buf = new GLchar[len]; 
    file.read(buf, len); 
    file.close(); 

    std::string type = fp.substr(fp.size()-4, 4); 
    if(type == ".vsh") 
     id = glCreateShader(GL_VERTEX_SHADER); 
    else if(type == ".fsh") 
     id = glCreateShader(GL_FRAGMENT_SHADER); 
    else if(type == ".csh") 
     id = glCreateShader(GL_COMPUTE_SHADER); 

    glShaderSource(id, 1, (const GLchar**)&buf, &len); 
    glCompileShader(id); 

    delete[] buf; 
+0

Попробуйте написать 'buf' в файл и смотрит на него. Возможно, вы ушли от одного или что-то в этом роде. На самом деле этого кода недостаточно, чтобы узнать об этом. Это поможет вашему вопросу показать, как вы находите 'len' и что такое' fp'. –

+0

Да, я забыл эту часть извините – bakkaa

+0

Может кто-нибудь сказать мне, почему у меня есть -1 для вопроса? что я сделал не так? – bakkaa

ответ

0

Ваша проблема заключается здесь:

file.seekg(0, file.end); 
GLint len = GLint(file.tellg()); 
file.seekg(0, file.beg); 

GLchar* buf = new GLchar[len]; 
file.read(buf, len); 
file.close(); 

Этот код читает точно длина файла и больше ничего. И, к сожалению, размеры файлов на самом деле не говорят вам о том, сколько на самом деле нужно читать; если файл чтения выходит из строя, он останется в любом мусоре, который был в памяти buf, указывает до того, как он был выделен вашей программе. Это объясняет, почему он работает в режиме отладки: в режиме отладки буферы обычно выделяются немного больше, чтобы обеспечить обнаружение доступа вне границ, а переменные и буферы, оставленные неинициализированными программистом, равны нулю. Хотя это полезно для некоторой отладки, это может привести к появлению регулярных ошибок в Heisenbugs.

Кроме того, ifstream::read может возвращать меньше запрошенного количества байтов, например, если вы столкнулись с концом ситуации с файлом и оставите остальную часть резервной копии нетронутой. Как бы то ни было, ifstream::get вернет NUL, если вы попадете в конец файла, поэтому он заполнит ваш буфер завершающими байтами NUL.

Правильный способ чтения файла передается в функции обработки строк C заключается в следующем:

file.seekg(0, file.end); 
GLint len = GLint(file.tellg()); 
file.seekg(0, file.beg); 

GLchar* buf = new GLchar[len + 1]; 
buf[len] = 0; 
file.read(buf, len); 
streamsize rb = file.gcount(); 
if(rb < len) { 
    /* file read short */ 
    /* either way zero out the remainder of 
    * the buffer untouched by the read. */ 
    memset(buf + rb, 0, len - rb); 

    /* should also log some warning message here. */ 
} 
file.close(); 
+0

Большое спасибо. Снова узнал что-то новое :) – bakkaa

-1

OK. Я просто попробовал другой метод чтения, и он сработал.

GLchar* buf = new GLchar[len]; 

    for(int i = 0; i < len; ++i) 
     buf[i] = file.get();  

    file.close(); 

Я думаю, что это ошибка компилятора Visual C++.

+0

Это маловероятно. Вероятно, в коде все еще есть проблема, и на данный момент вы случайно замаскировали его. Вы можете проверить фактическую проверку кодов ошибок от функций, которые могут выйти из строя, например 'read'. –

+0

Возможно, это маловероятно, но разве это не странно, что он отлично работал в режиме отладки и в режиме выпуска только иногда? И я просто изменил файл.read() на file.get(), и он тоже работал в режиме выпуска. – bakkaa

+0

Существуют тысячи программ, каждый день считывающих терабайты файлов с помощью Visual Studio. Это не ошибка компилятора, это что-то в вашей программе, которое вы не разделили. –

Смежные вопросы