Iphone Objective-C数组和类变量

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]; /

我将自己制作的安卓应用移植到iPhone上,遇到语法问题(我想)

我是根据这个例子来做这个项目的

我想从渲染过程中提取几何体以保持代码模块化,但我似乎无法让它工作。我创建了一个名为二十面体的类(注释是我对正在发生的事情的理解) 二十面体

#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*
,它们可以被传递给需要这些类型的函数


为了弄清楚是什么,最好在实现文件的顶层将初始值设置为single
static const
数组,然后在初始化时将这些值复制到对象拥有的数组中。你可以用几种方法来实现这一点,但最简单的方法可能是使用
memcpy
,如中所示。

啊,我甚至没有看到顶点/向量不匹配,非常感谢。啊,我甚至没有看到顶点/向量不匹配,非常感谢。啊,我怀疑这样做可能是必要的,但我没有看到任何与我所做的匹配的示例。非常感谢。我只是想跟进一下——我实现了这个方法并纠正了我的顶点/矢量3D错误,它工作起来很有魅力。谢谢大家的帮助。啊,我怀疑这样的事情可能是必要的,但我没有看到任何与我所做的相匹配的例子。非常感谢。我只是想跟进一下——我实现了这个方法并纠正了我的顶点/矢量3D错误,它工作起来很有魅力。谢谢大家的帮助。我曾经尝试过使用指针和值的一些组合,但每次我使用值,编译器都会对我产生反感。我会将你的信息与memcpy整合,并(希望)将其全部解决。干杯我曾尝试过使用指针和值的一些组合,但每次我使用值,编译器都会向我吐。我会将你的信息与memcpy整合,并(希望)将其全部解决。干杯