gpt4 book ai didi

iphone - 访问方法内部变量时 iPhone (C++) 上的 EXC_BAD_ACCESS

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:22 25 4
gpt4 key购买 nike

我正在使用 C++ 将 j2me 游戏移植到 iPhone,但我遇到了一个奇怪的问题。我的 C++ 技能不是最好的,我从事了多年的 Java 开发,并且多年没有接触过 C++。我的问题是我有一个类成员,它是在构造函数上分配的,但是当我尝试在此类的方法上访问此变量时,我得到了 EXC_BAD_ACCESS。我已经上网了,我找不到问题,我希望你能帮助我解决这个问题。以下是代码的修改版本:

游戏 Canvas .h

#include "Graphics.h"
#include "defs.h"

class GameCanvas {

Graphics* canvasGraphics;

public:

GameCanvas(void);

Graphics* getGraphics(void);

};

游戏 Canvas .cpp

#include <stdio.h>

#include "GameCanvas.h"

#include "Wrap-C-Interface.h"

GameCanvas::GameCanvas(void)
{
canvasGraphics = new Graphics();

// Sets up matrices and transforms for OpenGL ES
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, 320.0f, 480.0f);
glOrthof(0.0f, 320.0f,
480.0f, 0.0f,
-1.0f, 1.0f);

glMatrixMode(GL_TEXTURE);

glLoadIdentity();
glOrthof(0.0f, 512.0f*2,
0.0f, 512.0f*2,
-1.0f, 1.0f);

glMatrixMode(GL_MODELVIEW);

// Clears the view with black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

// Enable use of the texture
glEnable(GL_TEXTURE_2D);
// Set a blending function to use
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Enable blending
glEnable(GL_BLEND);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
}

Graphics* GameCanvas::getGraphics(void)
{
// Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
return canvasGraphics;
}

图形.h

#include "defs.h"

#include "iGraphics.h"
#include "Image.h"

class Graphics
{
public:
int test;

Graphics(void);

void setColor(int RGB);
void setColor(int red, int green, int blue);
void fillRect(int x, int y, int width, int height);

private:
Image* buffer;
GLuint textureFrameBuffer;

};

图形.cpp

#include "Graphics.h"

#include "Wrap-C-Interface.h"

Graphics::Graphics(void)
{
test = 314;
buffer = Image::createImage(512, 512);

// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);

// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, buffer->tex2d->texture, 0);

// restore frame buffer
restoreFrameBuffer();
};

void Graphics::setColor(int red, int green, int blue)
{
glColor4ub(red, green, blue, 255);
}

void Graphics::setColor(int RGB)
{
glColor4ub(RGB>>16&0xff, RGB>>8&0xff, RGB&0xff, 255);
}

void Graphics::fillRect(int x, int y, int width, int height)
{
GLshort vertices[] = {
x, y,
x + width, y,
x, y + height,
x + width, y + height,
};
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(2, GL_SHORT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

// restore default state
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
}

编辑:

我没有在原始帖子中提到它在调用 GameCanvas 的 getGraphics() 时挂起,在 getGraphics 中对 canvasGraphics 的任何访问都会给出 EXC_BAD_ACCESS。一个例子,如果我在 GameCanvas 构造函数上实例化此 Graphics 对象之后放置此行,它会按预期工作:

canvasGraphics = new Graphics();
printf("canvasGraphics %i\n", canvasGraphics->test);

但是 getGraphics 方法上的这个 printf 命令给出了 EXC_BAD_ACCESS。

Graphics* GameCanvas::getGraphics(void) 
{
// Here canvasGraphics is no longer alive, i got an EXC_BAD_ACCESS
printf("canvasGraphics %i\n", canvasGraphics->test);
return canvasGraphics;
}

最佳答案

您的问题可能出在这里:

buffer = Image::createImage(512, 512);

我注意到您没有检查返回值。 createImage 是否有可能返回 NULL

关于iphone - 访问方法内部变量时 iPhone (C++) 上的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6045254/

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