不推荐使用的函数和fseek()

时间:2015-03-11 21:18:42

标签: c++ opengl deprecated fseek

我遵循本教程:https://www.youtube.com/watch?v=0CQP8huwLCg

我在Mac上使用XCode而不是Windows VS.我把所有东西都联系在了一起。但是,我已弃用函数调用。另外,我的fseek(fp,0,SEEK_END);由于某种原因返回NULL。谁能告诉我如何修复弃用调用以及我可以在哪里找到更新的API?第二,为什么fseek返回null?我在同一个文件夹中有vsh和fsh文件......

这是在Mac上使用它的main.cpp代码:

#ifdef __APPLE_CC__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#endif
#include <stdio.h>
#include <iostream>
using namespace std;

static char* readFile(const char* filename) {
    // Open the file
    FILE* fp = fopen (filename, "r");
    // Move the file pointer to the end of the file and determing the length
    fseek(fp, 0, SEEK_END);
    long file_length = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    char* contents = new char[file_length+1];
    // zero out memory
    for (int i = 0; i < file_length+1; i++) {
        contents[i] = 0;
    }
    // Here's the actual read
    fread (contents, 1, file_length, fp);
    // This is how you denote the end of a string in C
    contents[file_length+1] = '\0';
    fclose(fp);
    return contents;
}

GLuint makeVertexShader(const char* shaderSource) {
    GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource (vertexShaderID, 1, (const GLchar**)&shaderSource, NULL);
    glCompileShader(vertexShaderID);
    return vertexShaderID;
}

GLuint makeFragmentShader(const char* shaderSource) {
    GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShaderID, 1, (const GLchar**)&shaderSource, NULL);
    glCompileShader(fragmentShaderID);
    return fragmentShaderID;
}

GLuint makeShaderProgram (GLuint vertexShaderID, GLuint fragmentShaderID) {
    GLuint shaderID = glCreateProgram();
    glAttachShader(shaderID, vertexShaderID);
    glAttachShader(shaderID, fragmentShaderID);
    glLinkProgram(shaderID);
    return shaderID;
}

int main (int argc, char** argv) {
    // Standard stuff...
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Shaders");
    //glewInit(); //only use for Windows platform

    char* vertexShaderSourceCode = readFile("vertexShader.vsh");
    char* fragmentShaderSourceCode = readFile("fragmentShader.fsh");
    GLuint vertShaderID = makeVertexShader(vertexShaderSourceCode);
    GLuint fragShaderID = makeFragmentShader(fragmentShaderSourceCode);
    GLuint shaderProgramID = makeShaderProgram(vertShaderID, fragShaderID);
    glUseProgram(shaderProgramID);
    printf ("vertShaderID is %d\n", vertShaderID);
    printf ("fragShaderID is %d\n", fragShaderID);
    printf ("shaderProgramID is %d\n", shaderProgramID);
    glDeleteProgram(shaderProgramID);
    int temp;
    scanf ("%d", &temp);
    return 0;
}

然后,这是vertexShader.vsh文件:

in vec4 s_vPosition;

void main () {
    // Look, Ma!  I avoided any matrix multiplication!
    // The value of s_vPosition should be between -1.0 and +1.0 (to be visible on the screen)
    gl_Position = s_vPosition;
}

然后,fragmentShader.fsh:

out vec4 s_vColor;

void main () {
    // No matter what, color the pixel red!
    fColor = vec4 (1.0, 0.0, 0.0, 1.0);
}

1 个答案:

答案 0 :(得分:1)

fseek (...)应该在成功时返回 0 (NULL),这是完全可以理解的。如果ftell (...)返回非零值,那么一切都很好。

  

&#34;它提供了错误的访问错误&#34;

首先,不要打扰归零内存。唯一重要的零是您在fclose (...)之上添加的零。这个过程不仅非常低效,而且你添加NULL终结符的行也是你问题的根源。

您有一个简单的逐个索引情况。

您已经分配了一个file_length+1字节的数组,然后尝试使用数组下标[file_length+1]添加一个NULL终止符。

这相当于以下表达式:*(contents + file_length + 1) = '\0',它将值'\0'写入超出已分配内存末尾的1个字节。

我责怪new [...]运算符,您可能已阅读第new char[file_length+1]行并忘记数组索引从 0 开始。

要解决您的问题,只需以这种方式重新编写代码:

// This is how you denote the end of a string in C
contents[file_length] = '\0';

顺便提一下,如果你选择保留将所有零写入分配内存的循环,你甚至不需要上面提到的那一行。我强烈建议你修改循环并修复你的数组下标。


对于已弃用的函数,不推荐使用任何内容。但是,您没有显示足够的代码来使这些着色器工作。至少你需要一个顶点属性指针。无论在何处完成,都可能是您弃用的函数错误的来源。