关于 OpenGL 的问题以及将 C 转换为 C++ 的过程

Posted

技术标签:

【中文标题】关于 OpenGL 的问题以及将 C 转换为 C++ 的过程【英文标题】:Problem regarding OpenGL and the process of converting C to C++ 【发布时间】:2009-02-26 09:38:27 【问题描述】:

好的。所以我想用一个用c++写的文件。我在 c 中运行了代码,完全没有问题。

由于我不懂c,所以用了一段时间的转换软件,但效果不佳(猜测编码格式不是它需要的样式)。我决定自己尝试一下,看起来我所要做的就是将一些 malloc 语句更改为新语句并用 delete 替换 free。所以我运行了这个程序,看起来大部分功能都可以正常工作,但是这个给我带来了麻烦。

当我尝试更新新图像的显示时(我正在读取 tiff 图像数据并将其显示在屏幕上),我在这些特定语句中遇到了问题:

glutReshapeWindow(ImageWidth,ImageLength);
glClear(GL_COLOR_BUFFER_BIT);//these
glRasterPos2i(0, 0);//three
glDrawPixels(ImageWidth, ImageLength, GL_RGB,
     GL_UNSIGNED_BYTE, ImageData);//statements are the ones giving me the error

我在代码块中包含了第一条语句,以表明它不会立即破坏任何类型的 OpenGL 调用。

我不断收到错误

Cannot access memory at address 0xfbad248c
Cannot access memory at address 0xfbad248c
Cannot access memory at address 0xaabbeeaa

我知道这可能有点含糊,但是这个错误的一些常见来源可能是什么?它在c中工作,在快速切换到c++时可能导致此错误?

谢谢,如果您需要更多信息,请告诉我。


好的,所以我并没有真正使用我认为的标准 OpenGL 库(这是针对课程的,我是由讲师提供的库文件)。我有代码

#include <GL/glut.h>

作为我的#include。这些库与 c 文件中的库完全相同,因为我只是将它们复制并粘贴到我的 c++ 项目中。 (我还在另一个 c++ 项目中以有限的方式与他们合作过)。以防万一,我检查了我的文件系统中的文件“OPENGL32.DLL”和“GLU32.DLL”,但没有找到它们。

我可能应该包括这些额外的细节:

在调用实际输入循环之前,在程序开头调用了一个 init() 方法:

void
init(void)

   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   makeCheckImage();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

此方法似乎工作正常(在此函数调用后不久创建了一个简单的棋盘模式)。我不确定它们属于哪种类型的 OpenGL 文件(“OPENGL32.DLL”或“GLU32.DLL”),但希望这可以稍微缩小问题范围。

至于 ImageData 行,我不相信 ImageData 对象已损坏或类似的东西,因为您所说的某些原因以及我发布的第一个代码块中的代码(错误源)位于 else 块中:

if (ImageData == NULL) /*code*/
else/*this is where the error code is*/

如果您认为有帮助,我可以在 makefile 上发布信息(如果不是的话,只是不想把这个线程与这些东西混为一谈)。

【问题讨论】:

【参考方案1】:

我不知道你对C和C++的区别有多少经验,所以我不想光顾你,但值得一试:

你用过吗

unsigned char* data = new unsigned char[size]; //correct
//....
delete[] data;

(数组分配) 或

unsigned char* data new unsigned char(size); //wrong
//....
delete data;

(分配一个具有值大小的字符)

为您的图像数据?

【讨论】:

【参考方案2】:

第一个不出错的语句是来自 GLU32.DLL 的命令,其他应该是 OPENGL32.DLL 命令。检查您是否正确链接库并尝试将 DLL 复制到程序目录中。

最后一行也可能是您的 ImageData 有一些错误,但是由于您说它在 C 中工作并且您只用 new/delete 替换了 malloc/free,所以那里不太可能有问题,无论如何您也应该检查一下.一种可能是在不涉及 OpenGL 调用的情况下读取整个 ImageData 数组。对了,我希望ImageLength不是完整图片文件的长度,而是图片的高度。

编辑:好的,所以它似乎有点不同。您发布的 init 函数似乎可以访问其他 gl... 函数,因此您的库以某种方式工作。顺便说一句,有趣的是您找不到 DLL。它们通常存储在 Windows\System32 路径中。

"if (ImageData == NULL)" 是第一步,但您也应该尝试读取所有 ImageWidth*ImageLength 条目以进行调试,也许您分配了错误的字节数。

崩溃的另一个原因可能是您使用的头文件不是最新的,并且与您的调用或 DLL 不兼容。

如果所有这些都不能解决您的问题,那么发布 makefile 确实很有用。

【讨论】:

"错误的字节数" 完全正确。挺尴尬的。不过,我非常感谢您的帮助;我会一直在转圈,因为上帝知道查看归档的 OpenGL 错误需要多长时间。

以上是关于关于 OpenGL 的问题以及将 C 转换为 C++ 的过程的主要内容,如果未能解决你的问题,请参考以下文章

简单的 C++ - 关于字符串和连接以及将 int 转换为字符串 [重复]

关于C语言的问题。设计一个程序,根据用户的选择,将1、日期转换为天数2、将天数转换为日期。

C: 将数组转换为 RGB 图像

关于将程序集转换为 c 的问题——特别是 movzbl 指令的作用? [复制]

对C转换说明符的误解以及关于数组的一些知识

关于在 C 中将 `void *` 转换为 `int` 的问题