Objective c 返回C结构数组
各位成员好? 类中的结构声明 我的问题是,我应该如何返回'particleSystems'数组,以便其他类可以访问它?我在下面的代码中尝试返回指针,但编译器给了我一个警告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
- (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预先分配内存;然后您可以执行所有您想要的回推操作,直到达到预先分配的限制。我经常这样做是为了防止额外的分配,而不必大量运行默认构造函数。