gpt4 book ai didi

c++ - glShaderSource 中的段错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:50 24 4
gpt4 key购买 nike

好的,我已经加载了一个 glVertex 着色器,作为来自 hexdump 的 const char 字符串。但是我从以下代码中得到一个编译器错误,我无法弄清楚为什么它拒绝编译它,并出现错误:

   main.cpp: In function ‘void loadShaders()’:main.cpp:27:55: error: cannot convert ‘const char (*)[92]’ to ‘const GLchar** {aka const char**}’ in argument passing     glShaderSource(vertexShader, 1, &vertex_glsl, NULL);                                                           ^

But when I override the error by casting &vertex_glsl to (const char**), it will compile but segfault on runtime. Why would this segfault?

const char vertex_glsl[] = {
0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x35, 0x30,
0x0a, 0x0a, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x6f,
0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69,
0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x7b, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x70, 0x6f, 0x73,
0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20,
0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x7d, 0x00
};
const int vertex_glsl_len = 92;

void loadShaders(){
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

// here's where it segfaults
glShaderSource(vertexShader, 1, &vertex_glsl, NULL);
glCompileShader(vertexShader);
}

最佳答案

虽然 C/C++ 指针和数组在许多上下文中的行为方式相同,但它们相同。您在这里偶然发现的初始编译错误和添加类型转换后的崩溃是两者不同的一个示例:

  • 应用于数组的& 运算符可为您提供数组 的地址,它是指向存储在数组中的数据的指针。应用运算符产生的实际地址(但不是类型)与数组中第一个元素的地址相同。所以有了这个声明:

    char s[] = "abc";

    下面两个表达式:

    &s
    &s[0]

    结果相同。同样,两个表达式的类型不同,第一个是指向数组的指针,第二个是指向字符的指针,但地址是相同的。

  • 应用于指针变量的 & 运算符可为您提供指针变量的地址。跟进同一个例子:

    char s[] = "abc";
    char* t = s;

    下面两个表达式:

    &t
    &t[0]

    导致地址不同。第一个是指针变量t的地址,而第二个也是指向第一个字符的指针,与上面的&s[0]相同。

glShaderSource()的第三个参数的类型是const GLchar**,这意味着您必须传递一个指针变量。您在第一次尝试时遇到的编译错误是一个严重的错误,因为您确实传递了错误类型的值(指向数组的指针)。添加类型转换只是让损坏的代码通过编译器,反而导致运行时崩溃。

要使其工作,您需要将字符串分配给 const GLchar* 类型的变量,并传递该变量的地址:

const GLchar* vertex_glsl_ptr = vertex_glsl;
glShaderSource(vertexShader, 1, &vertex_glsl_ptr, NULL);

这将在没有类型转换的情况下进行编译,并且在您运行时不会崩溃。

关于c++ - glShaderSource 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32512965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com