Objective c 返回C结构数组

Objective c 返回C结构数组,objective-c,c,opengl,Objective C,C,Opengl,各位成员好? 类中的结构声明 我的问题是,我应该如何返回'particleSystems'数组,以便其他类可以访问它?我在下面的代码中尝试返回指针,但编译器给了我一个警告 - (struct ParticleSystems *) commitParticles { struct ParticleSystems *ptr = &ParticleSystems; // it said, assigning incompatible pointer type retu

各位成员好?

类中的结构声明 我的问题是,我应该如何返回'particleSystems'数组,以便其他类可以访问它?我在下面的代码中尝试返回指针,但编译器给了我一个警告

- (struct ParticleSystems *) commitParticles
{
    struct ParticleSystems *ptr = &ParticleSystems; // it said, assigning incompatible pointer type
    
    return ptr;
}

还是需要分配“ParticleSystems”数组?请帮忙!谢谢

如果要在函数中创建数组,则应使用
new
动态分配该数组,然后返回指向该数组的指针

不能从函数返回数组,必须返回指向该函数的指针

示例代码:

ParticleSystems* doSomethingInteresting()
{
    ParticleSystems *ptr = new ParticleSystems[MAXIMUM_PARTICLES_ON_SCREEN];

    //do the processing

    return ptr;

}
调用者拥有返回的动态分配数组的所有权,需要取消分配该数组以避免内存泄漏:

delete []ptr;

如果要在函数内部创建数组,则应使用
new
动态分配数组,然后返回指向该数组的指针

不能从函数返回数组,必须返回指向该函数的指针

示例代码:

ParticleSystems* doSomethingInteresting()
{
    ParticleSystems *ptr = new ParticleSystems[MAXIMUM_PARTICLES_ON_SCREEN];

    //do the processing

    return ptr;

}
调用者拥有返回的动态分配数组的所有权,需要取消分配该数组以避免内存泄漏:

delete []ptr;

您将收到
分配不兼容指针类型
编译器警告,因为您的
ptr
声明应为
PointSprite*
类型,非
ParticleSystems*

您将收到
分配不兼容指针类型的编译器警告,因为您的
ptr
声明应为
PointSprite*
类型,而非
ParticleSystems*
您可以在分配一个后返回它,或者您可以填写用户传递给您的表格。后者将为接收数据的方法提供粒子系统的责任留给用户。它可以是本地数组,也可以是malloced数组

- (void) commitParticles: (ParticleSystems *) sprites
{
    // set members of the structs here
}

与返回malloced数组相比,我更喜欢这种传递。您的里程数可能会有所不同。

您可以在分配里程数后将其退还,也可以填写用户传递给您的里程数。后者将为接收数据的方法提供粒子系统的责任留给用户。它可以是本地数组,也可以是malloced数组

- (void) commitParticles: (ParticleSystems *) sprites
{
    // set members of the structs here
}

与返回malloced数组相比,我更喜欢这种传递。你的里程可能会有所不同。

正确答案在C、C++和Objto-C中是不同的。请选择一种语言来回答你的问题。正确答案在C、C++和Objto-C中是不同的。请选择一种语言来解决问题。在技术上正确的情况下,在C++中,我会使用一个STD::vector代替正则数组。如果希望避免复制周围矢量数据的开销,而不是使用普通指针,我建议使用boost::shared_ptr,即
shared_ptr ptr(新的向量> < /Cord> @ @ DeNeWORL:绝对,一个真正需要使用RAII并且几乎从不使用C++中的原始指针,但是如果OP已经知道了数组的元素数,那么使用数组而不是<代码> STD::vector < /Calp>避免向量的广泛分配是有意义的。创建一个大小为的std::vector,然后保持在该大小的范围内。这样就不会发生重新分配:
typedef std::vector PointSprite_vector;boost::shared_ptr ptr(新的PointSprite_vector(大小))<或代码>。或者可以使用vector::预留内存,然后可以做所有你想达到的预推限制。我做了很多来防止额外的分配,而不必运行默认构造函数alot。在技术上是正确的,在C++中,我会使用一个STD::vector代替正则数组。如果你想要一个避免复制周围矢量数据的开销,而不是使用普通指针,我建议使用boost::shared_ptr,即
shared_ptr ptr(新的向量> < /Cord> @ @ DeNeWORL:绝对,一个真正需要使用RAII并且几乎从不使用C++中的原始指针,但是如果OP已经知道了数组的元素数,那么使用数组而不是<代码> STD::vector < /Calp>避免向量的广泛分配是有意义的。创建一个大小为的std::vector,然后保持在该大小的范围内。这样就不会发生重新分配:
typedef std::vector PointSprite_vector;boost::shared_ptr ptr(新的PointSprite_vector(大小))
。或者您可以使用vector::reserve预先分配内存;然后您可以执行所有您想要的回推操作,直到达到预先分配的限制。我经常这样做是为了防止额外的分配,而不必大量运行默认构造函数。