- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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_objects
和 glShaderSource
是否已加载。
这里可能发生了什么?
经过一番修修补补后,我发现如果我在堆上制作一个 buffer
的拷贝,即从中制作一个 std::string
并传递 glShaderSource()
指向其 c_str()
返回的指针的指针,它起作用了。
现在我更糊涂了。
最重要的是,即使我简单地声明一个指向 buffer
的 char *
并将其传入,它也能正常工作。当您声明指向数组的指针与指向指针的指针时,C++11 会做一些特别的事情吗?
最佳答案
您错误地使用了 C 语法:
char buffer[1024];
...
glShaderSource(..., (const char **)&buffer, ...);
这不是指向真实字符串数据的指针。根据定义,&buffer
与此处的 buffer
相同 - 指向 buffer
中第一个 char
的指针,类型字符 *
。将其转换为其他内容只会隐藏此处的错误。
这个结构原则上是行不通的。没有保存该缓冲区地址的显式变量,编译器将在编译时直接将对 buffer
的访问转换为内存位置(在本例中,在堆栈上)。与常见的神话相反,数组与 C/C++ 中的指针不同。数组的名称只是评估为指向第一个对象的指针值,但这不是一回事。您要做的在概念上与获取立即值的地址相同:&12345
。您永远无法获得一开始就不存在的地址。
你当然可以做的是创建一个:
char buffer[1024];
char *pBuffer=buffer;
...
glShaderSource(..., &pBuffer, ...);
现在,您在内存中有一个指针,它实际上保存着缓冲区的地址。你当然可以取那个指针变量的地址,得到一个 char **
类型的表达式。
关于c++ - glShaderSource() 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27086313/
我正在尝试学习图形编程,并且编写了一个简单的 OpenGL 程序,该程序绘制一个三角形并将其着色为红色,但是当我为片段着色器调用函数 glShaderSource 时,它会导致段错误。 我不知道为什么
所以我一直收到错误“从 char** 到 const GLchar** 的无效转换”。我在这里阅读过关于此错误的类似帖子,但我似乎仍然无法修复它,因此非常感谢您的帮助。下面是我的 opengl c++
char buffer[1024]; memset(buffer, 0, sizeof(buffer)); FILE *vertexShaderFile = fopen(vertexShaderP
好的,我已经加载了一个 glVertex 着色器,作为来自 hexdump 的 const char 字符串。但是我从以下代码中得到一个编译器错误,我无法弄清楚为什么它拒绝编译它,并出现错误:
我已经尽力深入理解 OpenGL 的功能,但我对 glShaderSource 的参数有疑问: void glShaderSource( GLuint shader, GLsizei coun
由于 GLSL 没有包含文件选项,我试图通过使用“#pragma include”解析器来添加它。 (我想要这个是因为我有一些通用方法,我只想实现一次,但可能会在许多不同的着色器中使用,比如 Ken
我想知道 glShaderSource 在这种极端情况下的行为是否正确: glShaderSource(shader, 1, (const char**)ptr, length) 哪里: char *
因此,我正在尝试仅使用 Win32 API 和 OpenGL 来设置基本的 OpenGL 场景,但是我在加载着色器和 glShaderSource 函数方面遇到了很大的问题。我正在这样阅读我的文件:
我有以下代码: glShaderSource(shader, 1, (const char **)data.c_str(), NULL); 但这会使我的程序崩溃。如何将 std::string 转换为
我有一个存储在字符串值中的着色器: var myShader = " attribute vec4 a_position;" + " void main() {"
我正在尝试构建一个 OpenGL 应用程序。首先,我使用旧的固定功能管道进行绘图。然后我注意到这已经过时并且想切换到可编程管道。为此,我使用了网络上的一些教程。更改代码后,我尝试编译它,但我的编译器找
我正在尝试在 Mac 上使用库 GLFW3 编译一个相当简单的 C++ 程序。操作系统是 OS 10.9.3 (Maverick)。在我尝试使用 GLSL 函数(例如 glShaderSource 等
我是一名优秀的程序员,十分优秀!