Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL VBOs和指针的问题_C++_Pointers_Opengl - Fatal编程技术网

C++ OpenGL VBOs和指针的问题

C++ OpenGL VBOs和指针的问题,c++,pointers,opengl,C++,Pointers,Opengl,我正在启动OpenGL,而不是手动绑定缓冲区,我尝试创建一个函数来为我执行此操作,但我遇到了以下两个错误 error LNK2019: unresolved external symbol "void __cdecl createArrayBuffer(float *,unsigned int *,unsigned int)" (?createArrayBuffer@@YAXPAMPAII@Z) referenced in function "public: bool __thiscall Ex

我正在启动OpenGL,而不是手动绑定缓冲区,我尝试创建一个函数来为我执行此操作,但我遇到了以下两个错误

error LNK2019: unresolved external symbol "void __cdecl createArrayBuffer(float *,unsigned int *,unsigned int)" (?createArrayBuffer@@YAXPAMPAII@Z) referenced in function "public: bool __thiscall Example::init(void)" (?init@Example@@QAE_NXZ)
error LNK2019: unresolved external symbol "void __cdecl bindAndPoint(unsigned int *,int)" (?bindAndPoint@@YAXPAIH@Z) referenced in function "public: void __thiscall Example::render(void)" (?render@Example@@QAEXXZ)
我认为这与指针让我感到困惑有关。这是密码

BufferUtilities.cpp:

#define WIN32_LEAN_AND_MEAN
#define WIN32_EXTRA_LEAN

#include <windows.h>

#include "BufferUtilities.h"
#include <iostream>
#include <gl\GLU.h>

#define BUFFER_OFFSET(i) ((char *)NULL+(i))

bool start()
{
    glGenBuffers = (PFNGLGENBUFFERSARBPROC)wglGetProcAddress("glGenBuffers");
    glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
    glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");

    if (!glGenBuffers || !glBindBuffer || !glBufferData)
    {
        std::cerr << "Vertex buffer objects are not supported by your graphics card." << std::endl;
        return false;
    }

    return true;
}

inline void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
    glGenBuffers(1, buffer);
    glBindBuffer(GL_ARRAY_BUFFER, *buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * (sizeof(array)/sizeof(array[0])), &array[0], usage);
}

inline void bindAndPoint(GLuint *buffer, int size)
{
    glBindBuffer(GL_ARRAY_BUFFER, *buffer);
    glColorPointer(size, GL_FLOAT, 0, BUFFER_OFFSET(0));
}
从这两个函数中删除内联可以进行编译,但在glDrawArrays的运行时会出现一个新错误(GL_TRIANGLE_STRIP,0,4)。是的


我检查了所有指针是否都为空,而不是。我还检查了init()和start()是否返回true,它们确实返回了true。

您误用了
inline
关键字。从函数定义和原型中删除它,代码应该编译。例如:

void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage);
void bindAndPoint(GLuint *buffer, int size);
BufferUtilities.h
BufferUtilities.cpp

将函数声明为
inline
时,必须将声明和定义放在同一文件中。通常是头文件。通过阅读和链接进一步了解这个概念

至于运行时错误,您传递给函数的一个指针似乎为null。 在使用指针参数时,最好向其添加一些检查。例如:

#include <assert.h>

void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
    assert(array != NULL);
    assert(buffer != NULL);
    ...
}
#包括
void createArrayBuffer(GLfloat*数组、GLuint*缓冲区、GLenum使用)
{
断言(数组!=NULL);
断言(缓冲区!=NULL);
...
}

如果其中一个指针为空,
assert
s将通过停止程序执行并调用调试器来帮助您查明错误。

您误用了
inline
关键字。从函数定义和原型中删除它,代码应该编译。例如:

void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage);
void bindAndPoint(GLuint *buffer, int size);
BufferUtilities.h
BufferUtilities.cpp

将函数声明为
inline
时,必须将声明和定义放在同一文件中。通常是头文件。通过阅读和链接进一步了解这个概念

至于运行时错误,您传递给函数的一个指针似乎为null。 在使用指针参数时,最好向其添加一些检查。例如:

#include <assert.h>

void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
{
    assert(array != NULL);
    assert(buffer != NULL);
    ...
}
#包括
void createArrayBuffer(GLfloat*数组、GLuint*缓冲区、GLenum使用)
{
断言(数组!=NULL);
断言(缓冲区!=NULL);
...
}

如果其中一个指针为空,则通过停止程序执行并调用调试器,
assert
s将帮助您查明错误。

我发现至少有3个问题:

  • 显然是内联的。已经陈述和解释了。下一个
  • 0xC0000005很可能意味着您正在使用空地址调用函数。检查
    start
    Engine::init
    函数是否返回
    true
  • glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*(sizeof(ARRAY)/sizeof(ARRAY[0]),&ARRAY[0],用法)请再说一遍,尺寸是多少
    typeof(array)==GLfloat*
    ,=>
    typeof(array[0])==GLfloat
    ,=>大小是
    sizeof(GLfloat*)/sizeof(GLfloat)
    ,在32位x86操作系统上是1,在64位操作系统上是2,这两种情况下都是不正确的

  • 我发现至少有3个问题:

  • 显然是内联的。已经陈述和解释了。下一个
  • 0xC0000005很可能意味着您正在使用空地址调用函数。检查
    start
    Engine::init
    函数是否返回
    true
  • glBufferData(GL_ARRAY_BUFFER,sizeof(GLfloat)*(sizeof(ARRAY)/sizeof(ARRAY[0]),&ARRAY[0],用法)请再说一遍,尺寸是多少
    typeof(array)==GLfloat*
    ,=>
    typeof(array[0])==GLfloat
    ,=>大小是
    sizeof(GLfloat*)/sizeof(GLfloat)
    ,在32位x86操作系统上是1,在64位操作系统上是2,这两种情况下都是不正确的

  • createArrayBuffer
    的定义移动到头文件中,或从中删除关键字
    inline
    。使用调试器到达有问题的行。另一件事:永远不要使用通过wglGetProcAddress的函数指针的可用性作为功能支持指示器。OpenGL实现可能会为您提供函数指针,即使某些功能不受支持。例如,当缓冲区对象只是扩展而不是核心功能时,顶点缓冲区对象(VBO)和像素缓冲区对象(PBO)是不同的功能,但重用了
    gl…Buffer
    功能。始终检查GL_扩展字符串是否支持功能。+1到@datenwolf-我记得有些实现返回非空指针,即使在某些肯定不存在的乱七八糟的函数名上(我记得是在android上),也会将
    createArrayBuffer
    的定义移动到头文件,或者从中删除关键字
    inline
    。使用调试器到达有问题的行。另一件事:永远不要使用通过wglGetProcAddress的函数指针的可用性作为功能支持指标。OpenGL实现可能会为您提供函数指针,即使某些功能不受支持。例如,当缓冲区对象只是扩展而不是核心功能时,顶点缓冲区对象(VBO)和像素缓冲区对象(PBO)是不同的功能,但重用了
    gl…Buffer
    功能。始终检查GL_扩展字符串是否支持功能。+1到@datenwolf-我记得有些实现返回非空指针,即使是在一些肯定不存在的乱七八糟的函数名上(我记得是在android上),例如通过将大小(或至少元素计数)作为单独的函数参数传递。我使用vectorE.g修复了它。通过将大小(或至少元素计数)作为单独的函数参数传递。我使用向量修复了它
    #include <assert.h>
    
    void createArrayBuffer(GLfloat *array, GLuint *buffer, GLenum usage)
    {
        assert(array != NULL);
        assert(buffer != NULL);
        ...
    }