Iphone Objective-C数组和类变量
我将自己制作的安卓应用移植到iPhone上,遇到语法问题(我想) 我是根据这个例子来做这个项目的 我想从渲染过程中提取几何体以保持代码模块化,但我似乎无法让它工作。我创建了一个名为二十面体的类(注释是我对正在发生的事情的理解) 二十面体Iphone Objective-C数组和类变量,iphone,objective-c,pointers,opengl-es,Iphone,Objective C,Pointers,Opengl Es,我将自己制作的安卓应用移植到iPhone上,遇到语法问题(我想) 我是根据这个例子来做这个项目的 我想从渲染过程中提取几何体以保持代码模块化,但我似乎无法让它工作。我创建了一个名为二十面体的类(注释是我对正在发生的事情的理解) 二十面体 #import <Foundation/Foundation.h> #import "OpenGLCommon.h" @interface Icosahedron : NSObject { Vertex3D *vertices[12]; /
#import <Foundation/Foundation.h>
#import "OpenGLCommon.h"
@interface Icosahedron : NSObject {
Vertex3D *vertices[12]; //allocate a group of 12 Vertex3D pointers
Vertex3D *normals[12]; // ditto
GLubyte *faces[60]; // ditto but with 60 face values
}
// Declare methods
-(Vertex3D *) vertices;
-(void) setVertices:(Vector3D *)setVerts;
-(Vertex3D *) normals;
-(void) setNormals:(Vector3D *)setNorms;
-(GLubyte *) faces;
-(void) setFaces:(GLubyte *)setFaces;
@end
此时值没有正确填充,只有第一个值是正确的
return self;
}
@end
我想做的就是能打电话给
...
ico=[[Icosahedron alloc] init];
glVertexPointer(3, GL_FLOAT, 0, [ico vertices]);
...
在渲染部分,但我能得到的最远结果是在二十面体类中设置Vertex3Ds的第一个值,并且我在调试器中为渲染类中的任何二十面体的值设置“超出范围”
我怀疑这只是我在学习Objective-C的怪癖,但我已经尝试了许多不同的方法几天了,似乎没有什么能让我有所收获
请帮帮我,你是我唯一的希望。首先,你似乎在交替使用“Vertex3D”和“Vector3D”。我不知道这是否真的是个问题 我认为数组应该声明为值数组,而不是指针数组。所以
Vertex3D vertices[12]; //allocate a group of 12 Vertex3D pointers
Vertex3D normals[12]; // ditto
GLubyte faces[60]; // ditto but with 60 face values
这样,您就可以容纳所有的值,而不仅仅是指向其他向量的指针(您还没有分配)
另外,典型的初始序列是:
-(id)init
{
if (self = [super init])
{
//do initialization stuff
}
return self;
}
它处理错误更加优雅。首先,您似乎在交替使用“Vertex3D”和“Vector3D”。我不知道这是否真的是个问题 我认为数组应该声明为值数组,而不是指针数组。所以
Vertex3D vertices[12]; //allocate a group of 12 Vertex3D pointers
Vertex3D normals[12]; // ditto
GLubyte faces[60]; // ditto but with 60 face values
这样,您就可以容纳所有的值,而不仅仅是指向其他向量的指针(您还没有分配)
另外,典型的初始序列是:
-(id)init
{
if (self = [super init])
{
//do initialization stuff
}
return self;
}
它处理错误更加优雅。您的指针和数组被搞混了。你会想要这样的东西:
Vertex3D vertices[12];
- (void) setVertices: (Vertex3D *)newVertices;
{
memcpy( vertices, newVertices, 12 * sizeof( Vertex3D ) );
}
- (Vertex3D *) vertices;
{
return vertices;
}
要在C中复制数组,您必须使用memcpy(或手写循环),而不能使用赋值运算符。您的指针和数组混淆了。你会想要这样的东西:
Vertex3D vertices[12];
- (void) setVertices: (Vertex3D *)newVertices;
{
memcpy( vertices, newVertices, 12 * sizeof( Vertex3D ) );
}
- (Vertex3D *) vertices;
{
return vertices;
}
要复制C语言中的数组,必须使用memcpy(或手写循环),不能使用赋值运算符。您对
顶点的声明
,法线
和面
是指向相关实体的指针数组。然而,看起来您真正想要的是拥有结构/值本身的数组。因此,您的界面应该说:
Vertex3D vertices[12];
Vertex3D normals[12];
GLubyte faces[60];
然后,您的对象将拥有一块内存,其中包含12个顶点、12个法线和60个面(嗯,不管它们是什么--GLubyte
值)
指针和数组在C/Objective-C中是可以互换的。因此顶点
和法线
也可以被认为是顶点3D*
值,面
可以被认为是GLubyte*
,它们可以被传递给需要这些类型的函数
为了弄清楚是什么,最好在实现文件的顶层将初始值设置为single
static const
数组,然后在初始化时将这些值复制到对象拥有的数组中。您可以用几种方法来实现这一点,但最简单的方法可能是使用memcpy
。您对顶点的声明,法线
和面
是指向相关实体的指针数组。然而,看起来您真正想要的是拥有结构/值本身的数组。因此,您的界面应该说:
Vertex3D vertices[12];
Vertex3D normals[12];
GLubyte faces[60];
然后,您的对象将拥有一块内存,其中包含12个顶点、12个法线和60个面(嗯,不管它们是什么--GLubyte
值)
指针和数组在C/Objective-C中是可以互换的。因此顶点
和法线
也可以被认为是顶点3D*
值,面
可以被认为是GLubyte*
,它们可以被传递给需要这些类型的函数
为了弄清楚是什么,最好在实现文件的顶层将初始值设置为singlestatic const
数组,然后在初始化时将这些值复制到对象拥有的数组中。你可以用几种方法来实现这一点,但最简单的方法可能是使用memcpy
,如中所示。啊,我甚至没有看到顶点/向量不匹配,非常感谢。啊,我甚至没有看到顶点/向量不匹配,非常感谢。啊,我怀疑这样做可能是必要的,但我没有看到任何与我所做的匹配的示例。非常感谢。我只是想跟进一下——我实现了这个方法并纠正了我的顶点/矢量3D错误,它工作起来很有魅力。谢谢大家的帮助。啊,我怀疑这样的事情可能是必要的,但我没有看到任何与我所做的相匹配的例子。非常感谢。我只是想跟进一下——我实现了这个方法并纠正了我的顶点/矢量3D错误,它工作起来很有魅力。谢谢大家的帮助。我曾经尝试过使用指针和值的一些组合,但每次我使用值,编译器都会对我产生反感。我会将你的信息与memcpy整合,并(希望)将其全部解决。干杯我曾尝试过使用指针和值的一些组合,但每次我使用值,编译器都会向我吐。我会将你的信息与memcpy整合,并(希望)将其全部解决。干杯