Вопрос или проблема
Привет, я изучаю C++ и OpenGL. На https://learnopengl.com/Getting-started/Hello-Window
есть пример того, как открыть окно OpenGL с помощью GLFW. Однако при компиляции на строке 31 я получаю ошибку:
hellowindow.cpp: в функции ‘int main()’:
hellowindow.cpp:33:16: ошибка: ‘width’ не объявлен в этой области видимости; вы имели в виду ‘wcwidth’?
33 | glViewport(0,0,width,height);
| ^~~~~
| wcwidth
hellowindow.cpp:33:22: ошибка: ‘height’ не объявлен в этой области видимости
33 | glViewport(0,0,width,height);
в примере показано void framebuffer_size_callback(GLFWwindow* window, int width, int height);
с точкой с запятой и без нее.
когда я убираю точку с запятой, я получаю
hellowindow.cpp: в функции ‘int main()’:
hellowindow.cpp:32:1: ошибка: определение функции не разрешено здесь до ‘
’ токена
32 | {
Пожалуйста, помогите мне скомпилировать.
Ответ или решение
Здравствуйте. Ваш запрос относится к вопросу инициализации окна OpenGL с использованием библиотеки GLFW, при этом возникает ошибка компиляции в C++. Давайте разберёмся в этой проблеме.
Теория:
Ошибка, которую вы наблюдаете, указывает на отсутствие объявления переменных width
и height
в области видимости функции main()
. В языке C++ переменные должны быть объявлены в той области, где они используются, или переданы как параметры. В вашем случае вы, вероятно, пытаетесь вызвать функцию glViewport(0, 0, width, height);
, где значения width
и height
не были ранее определены в коде функции main()
.
Пример:
Рассмотрим стандартный способ использования функции glViewport
. Обычно она используется в функции обратного вызова, такой как framebuffer_size_callback
, чтобы обновить размеры видового экрана при изменении размера окна. Код может выглядеть следующим образом:
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
int main()
{
// Код инициализации GLFW и OpenGL...
// Установка функции обратного вызова для изменения размера окна
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// Основной цикл рендеринга
while (!glfwWindowShouldClose(window))
{
// Код рендеринга...
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Применение:
Чтобы исправить вашу ошибку, вам необходимо убедиться в правильной реализации и следованию обычной практике использования функций обратного вызова. Проверьте следующие моменты:
- Определите функцию
framebuffer_size_callback
отдельно в вашем файле, без точки с запятой после её объявления. - Убедитесь, что вы правильно устанавливаете функцию обратного вызова с помощью
glfwSetFramebufferSizeCallback
. - Вызовите
glViewport
внутри функцииframebuffer_size_callback
, а не вmain
, если размеры окна передаются через функцию обратного вызова.
Таким образом, ваша программа должна успешно скомпилироваться и выполниться без ошибок, связанных с объявлением переменных. Помните, что в C++ правильное объявление и передача параметров – ключевые элементы написания корректного и работающего кода.