У меня проблема с C++, которую я просто не могу понять.C++, OpenGL: странная проблема с c-строками
У меня есть 2 несколько разных функций. Оба они должны делать то же самое. Но только один работает правильно.
Способ 1: вход метода является 'Const строка samplerName = "тест"'
void setUniformSampler(Gluint program, const string samplerName, GLuint sampler) {
GLint uniformLocation = glGetUniformLocation(program, samplerName.c_str()); // returns -1
if(uniformLocation >= 0) {
glUniform1i(uniformLocation, sampler);
} else {
throw exception(...);
}
}
Способ 2:
void setUniformSampler(Gluint program, GLuint sampler) {
GLint uniformLocation = glGetUniformLocation(program, "test"); // returns 0
if(uniformLocation >= 0) {
glUniform1i(uniformLocation, sampler);
} else {
throw exception(...);
}
}
Как вы можете видеть, glGetUniformLocation возвращает 2 разных значения. Правильное возвращаемое значение будет «0», а не «-1». Интересно, в чем же разница между двумя вызовами?
quote: "c_str() генерирует последовательность символов (c-string) с нулевым завершением с тем же содержимым, что и строковый объект, и возвращает его как указатель на массив символов". И это именно то, что метод glGetUniformLocation (...) нуждается в качестве второго параметра. Итак, почему только метод 2 выше преуспевает? Это проблема компилятора?
Я работаю с MS Visual Studio 2008 на Win7.
Я искал эту ошибку уже почти 2 дня. Я действительно хочу это прояснить. Это сводило меня с ума ...
Thanks Walter
EDIT:
Это не работает.
void setUniformSampler(Gluint program, const string samplerName, GLuint sampler) {
const GLchar* name = samplerName.c_str();
GLint uniformLocation = glGetUniformLocation(program, name); // still returns -1
if(uniformLocation >= 0) {
glUniform1i(uniformLocation, sampler);
} else {
throw exception(...);
}
}
Вы уверены, что строка `samplerName` фактически содержит` test`? Вы можете проверить с помощью отладчика или вызов `printf()`? – 2010-12-09 06:22:44
Да, я использовал отладчик Visual Studio, и я могу скрыть, что samplerName содержит тест. – Walter 2010-12-09 06:23:40
Как насчет `программы`? Правильно ли она инициализирована/передана в первом случае? – 2010-12-09 06:31:35